#pragma once
#include"DxLib.h"
#include"Image.h"
#define NULL_HANDLE -1

namespace DXFW
{
/// <summary>動画を管理するクラス</summary>
/// <example>
/// [サンプルコード:未完成]<BR>
/// サンプル説明<BR>
/// <code>
/// int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )<BR>
/// {<BR>
///		if( !Dx::Initialise() ) return -1;<BR>
///		Dx::End();<BR>
///		return 0;<BR>
/// }<BR>
/// </code>	
/// </example>
class Movie
{
private:
	std::string fileName;
public:
	
	/// <summary>動画ファイルの登録</summary>
	Movie(const char *ファイル名)
	{
		this->fileName = ファイル名;
	}
	
	///<summary>動画ファイルの登録</summary>
	///ムービーファイル名を登録する。
	///メモリには読み込まれない。
	bool Load(const char *ファイル名)
	{
		this->fileName = ファイル名;
		return true;
	}

	///<summary>動画を再生</summary>
	///拡大は整数倍のみ
	///途中キャンセルフラグがtrueの場合、再生中に入力すると途中で再生を中断する
	bool Play(int 拡大率 , bool 途中キャンセルフラグ)
	{
		if( 途中キャンセルフラグ )
		{
			PlayMovie( fileName.c_str() , 拡大率 , DX_MOVIEPLAYTYPE_BCANCEL ) ;
		}else{
			PlayMovie( fileName.c_str() , 拡大率 , DX_MOVIEPLAYTYPE_NORMAL ) ;
		}
	}
};
	
///<summary>
///Imageクラスの動画版
///</summary>
///<example>
///[サンプルコード:未完成]<BR>
///サンプル説明<BR>
///<code>
///int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )<BR>
///{<BR>
///	if( !Dx::Initialise() ) return -1;<BR>
///	Dx::End();<BR>
///	return 0;<BR>
///}<BR>
///</code>	
///</example>
class MovieImage
{
private:
	int handle;
	bool isTrans;
	MovieImage(const MovieImage &movie);
	MovieImage& operator =(const MovieImage &movie);
public:
	MovieImage():
		isTrans(false),
		handle( NULL_HANDLE )
	{}
	
	///<summary>ファイルの読込</summary>
	MovieImage(const char *ファイル名)
	{
		this->handle = DxLib::LoadGraph(ファイル名);
	}

	///<summary>ファイルの読込</summary>
	///動画ファイルをメモリに読み込む。
	int Load(const char *ファイル名)
	{
		if(this->handle != NULL_HANDLE) DxLib::DeleteGraph(this->handle);
		this->handle = DxLib::LoadGraph(ファイル名);
		return this->handle;
	}

	///<summary>ファイルの開放</summary>
	///動画ファイルをメモリから開放する。
	bool Release()
	{
		return !DxLib::DeleteGraph(this->handle);
	}

	///<summary>ハンドルの取得</summary>
	int GetHandle()
	{
		return this->handle;
	}
	
	///<summary>動画の再生</summary>
	bool Play()
	{
		return !DxLib::PlayMovieToGraph( this->handle );
	}
	
	///<summary>動画の停止</summary>
	bool Pause()
	{
		return !DxLib::PauseMovieToGraph( this->handle ) ;
	}
	
	///<summary>動画の再生位置を設定</summary>
	int Seek(int time)
	{
		return DxLib::SeekMovieToGraph( this->handle , time ) ;
	}
	
	///<summary>動画の再生位置を取得</summary>
	int Tell()
	{
		return DxLib::TellMovieToGraph( this->handle ) ;
	}
	
	///<summary>動画が再生中か取得</summary>
	bool Check()
	{
		return (DxLib::GetMovieStateToGraph( this->handle ) == 1);
	}
	
	/// <summary>指定座標に描画</summary>
	bool Draw(int x,int y , bool isTurn = false)
	{
		if( isTurn ) return !DxLib::DrawTurnGraph( x , y , this->handle , this->isTrans );
		else		 return !DxLib::DrawGraph( x , y , this->handle , this->isTrans );
	}

	/// <summary>指定矩形内に描画</summary>
	bool DrawExtend(int x1,int y1,int x2,int y2)
	{
		return !DxLib::DrawExtendGraph( x1 , y1 , x2 , y2 , this->handle , this->isTrans );
	}

	/// <summary>角度、拡大率を指定して描画</summary>
	bool DrawRotate(int x,int y,double extRate,double angle,bool isTurn)
	{
		return !DxLib::DrawRotaGraph( x , y , extRate , angle , this->handle , this->isTrans , isTurn );
	}
	
	/// <summary>角度、拡大率を指定して描画</summary>
	bool DrawRotateAxis(int x,int y,int cx,int cy,double extRate,double angle,bool isTurn)
	{
		return !DxLib::DrawRotaGraph2( x , y , cx , cy , extRate , angle , this->handle , this->isTrans , isTurn );
	}
	
	/// <summary>回転軸、角度、拡大率を指定して描画</summary>
	bool DrawRotateAxis(int x,int y,int cx,int cy,double extRateX,double extRateY,double angle,bool isTurn)
	{
		return !DxLib::DrawRotaGraph3( x , y , cx , cy , extRateX , extRateY , angle , this->handle , this->isTrans , isTurn );
	}
	
	/// <summary>回転軸、角度、拡大率を縦横別に指定して描画</summary>
	bool DrawModify(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4)
	{
		return !DxLib::DrawModiGraph( x1 , y1 , x2 , y2 , x3 , y3 , x4 , y4 , this->handle , this->isTrans );
	}
	
	/// <summary>イメージの一部を指定して描画</summary>
	bool DrawPart(int destX,int destY,int srcX, int srcY, int width, int height, bool isTurn)
	{
		return !DxLib::DrawRectGraph( destX , destY , srcX , srcY , width , height , this->handle , this->isTrans , isTurn );
	}
	
	/// <summary>幅を取得</summary>
	int GetWidth()
	{
		int w,h;
		DxLib::GetGraphSize( this->handle , &w , &h );
		return w;
	}
	
	/// <summary>高さを取得</summary>
	int GetHeight()
	{			
		int w,h;
		DxLib::GetGraphSize( this->handle , &w , &h );
		return h;
	}

};
}