/*
**	Command & Conquer Generals Zero Hour(tm)
**	Copyright 2025 Electronic Arts Inc.
**
**	This program is free software: you can redistribute it and/or modify
**	it under the terms of the GNU General Public License as published by
**	the Free Software Foundation, either version 3 of the License, or
**	(at your option) any later version.
**
**	This program is distributed in the hope that it will be useful,
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**	GNU General Public License for more details.
**
**	You should have received a copy of the GNU General Public License
**	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

////////////////////////////////////////////////////////////////////////////////
//																																						//
//  (c) 2001-2003 Electronic Arts Inc.																				//
//																																						//
////////////////////////////////////////////////////////////////////////////////

// FILE: WindowVideoManager.h /////////////////////////////////////////////////
//-----------------------------------------------------------------------------
//                                                                          
//                       Electronic Arts Pacific.                          
//                                                                          
//                       Confidential Information                           
//                Copyright (C) 2002 - All Rights Reserved                  
//                                                                          
//-----------------------------------------------------------------------------
//
//	created:	Mar 2002
//
//	Filename: 	WindowVideoManager.h
//
//	author:		Chris Huybregts
//	
//	purpose:	
//
//-----------------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////

#pragma once

#ifndef __WINDOWVIDEOMANAGER_H_
#define __WINDOWVIDEOMANAGER_H_

//-----------------------------------------------------------------------------
// SYSTEM INCLUDES ////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// USER INCLUDES //////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// FORWARD REFERENCES /////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
class GameWindow;
class AsciiString;
class VideoStreamInterface;
class VideoBuffer;

//-----------------------------------------------------------------------------
// TYPE DEFINES ///////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------


enum WindowVideoPlayType
{
	WINDOW_PLAY_MOVIE_ONCE = 0,
	WINDOW_PLAY_MOVIE_LOOP,
	WINDOW_PLAY_MOVIE_SHOW_LAST_FRAME,

	WINDOW_PLAY_MOVIE_COUNT
};

enum WindowVideoStates
{
	WINDOW_VIDEO_STATE_START = 0,
	WINDOW_VIDEO_STATE_STOP,
	WINDOW_VIDEO_STATE_PAUSE,
	WINDOW_VIDEO_STATE_PLAY,
	WINDOW_VIDEO_STATE_HIDDEN,
	
	WINDOW_VIDEO_STATE_COUNT	
};

class WindowVideo
{
public:
	WindowVideo( void );
	~WindowVideo( void );
	
	VideoStreamInterface *getVideoStream( void );
	VideoBuffer *getVideoBuffer( void );
	GameWindow *getWin( void );
	AsciiString getMovieName( void );
	WindowVideoPlayType getPlayType ( void );
	WindowVideoStates getState( void );

	void setPlayType(WindowVideoPlayType playType);
	void setWindowState( WindowVideoStates state );

	void init( GameWindow *win, AsciiString movieName, WindowVideoPlayType playType,VideoBuffer *videoBuffer, 
	VideoStreamInterface *videoStream);
	
private:
	WindowVideoPlayType m_playType;
	GameWindow *m_win;
	VideoBuffer *m_videoBuffer;
	VideoStreamInterface *m_videoStream;
	AsciiString m_movieName;
	WindowVideoStates m_state;

};


class WindowVideoManager : public SubsystemInterface
{
public:
	WindowVideoManager( void );
	~WindowVideoManager( void );

	// Inhertited from subsystem ====================================================================
	virtual void init( void );			
	virtual void reset( void );			
	virtual void update( void );		
	//===============================================================================================

	
	void playMovie( GameWindow *win, AsciiString movieName, WindowVideoPlayType playType );
	void hideMovie( GameWindow *win );							///< If the window becomes hidden while we're playing, stop the movie but test to see if we should resume
	void pauseMovie( GameWindow *win );							///< Pause a movie and display it's current frame
	void resumeMovie( GameWindow *win );						///< If a movie has been stopped, resume it.
	void stopMovie( GameWindow *win );							///< Stop a movie
	void stopAndRemoveMovie( GameWindow *win );			///< Stop a movie, and remove it from the manager
	void stopAllMovies( void );											///< Stop all playing movies
	void pauseAllMovies( void );										///< Pauses all movies on their current frame
	void resumeAllMovies( void );										///< Resume Playing all movies
	Int getWinState( GameWindow *win );			///< return the current state of the window.
	
private:

	typedef const GameWindow* ConstGameWindowPtr;
	// use special class for hashing, since std::hash won't compile for arbitrary ptrs
	struct hashConstGameWindowPtr
	{
	size_t operator()(ConstGameWindowPtr p) const
	{
		std::hash<UnsignedInt> hasher;
		return hasher((UnsignedInt)p);
	}
	};

	typedef std::hash_map< ConstGameWindowPtr, WindowVideo *, hashConstGameWindowPtr, std::equal_to<ConstGameWindowPtr> > WindowVideoMap;

	WindowVideoMap m_playingVideos;								///< List of currently playin Videos
	//WindowVideoMap m_pausedVideos;									///< List of currently paused Videos
	Bool m_stopAllMovies;														///< Maintains is we're in a stop all Movies State
	Bool m_pauseAllMovies;													///< Maintains if we're in a pause all movies state


};

//-----------------------------------------------------------------------------
// INLINING ///////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
inline VideoStreamInterface *WindowVideo::getVideoStream( void ){ return m_videoStream; };
inline VideoBuffer *WindowVideo::getVideoBuffer( void ){ return m_videoBuffer; };
inline GameWindow *WindowVideo::getWin( void ){ return m_win; };
inline AsciiString WindowVideo::getMovieName( void ){ return m_movieName; };
inline WindowVideoPlayType WindowVideo::getPlayType ( void ){ return m_playType; };
inline WindowVideoStates WindowVideo::getState( void ){ return m_state; };

inline void WindowVideo::setPlayType(WindowVideoPlayType playType){ m_playType = playType; };
	


//-----------------------------------------------------------------------------
// EXTERNALS //////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------

#endif // __WINDOWVIDEOMANAGER_H_