#pragma once//☀SDL
#include <Multimedia/Window.h>
#include <Multimedia/Input.h>
#include <Multimedia/Font.h>
#include <Multimedia/Music.h>

namespace SDX
{
/** ライブラリの初期化やシステム的な処理を行う関数群.*/
/**    \include SystemSample.h*/
class System
{
private:
    System();
    ~System();
    static bool isEnd;
	static Renderer defaultRenderer;
public:

    /** ライブラリの初期化.*/
    /**    初期化に失敗した場合、ソフトを強制的に終了する。\n
        一部の設定関数は初期化前に呼び出す必要がある。*/
    static void Initialise( const char* ウィンドウ名 , int 幅 , int 高さ )
    {
        if (SDL_Init( SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO ) < 0) 
        {
            fprintf(stderr, "SDLの初期化に失敗しました：%s\n", SDL_GetError());
            exit(1);
            return;
        }

        setlocale(LC_CTYPE, "jpn");//文字コードを日本語に

        int flag = 0;
        if (Window::Single().isFullScreen)
        {
            flag = SDL_WINDOW_FULLSCREEN;
        }

        Window::Single().width  = 幅;
        Window::Single().height = 高さ;

        Window::Single().handle = SDL_CreateWindow( ウィンドウ名 ,SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 幅 , 高さ , flag);
       
		defaultRenderer.Create(Window::Single().handle);

		Screen::SetRenderer(defaultRenderer);
		
        #ifdef TABLET
            int dpiX;
            int dpiY;
            SDL_GetWindowSize( Window::Single().handle, &dpiX, &dpiY);
            Window::Single().aspect = (double)dpiX / dpiY;
            SDL_RenderSetLogicalSize( Screen::GetHandle() , 幅, 高さ);
        #endif

        TTF_Init();

        //デフォルトフォントの設定
        Drawing::SetDefaultFont( SystemFont::Gothic , 16 );

        SDL_InitSubSystem( SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER | SDL_INIT_EVERYTHING );

        SDL_JoystickEventState(SDL_ENABLE);

        if( SDL_NumJoysticks() > 0 )
        {
            Input::pad.Open();
        }

        //音声関連の初期化
        Mix_Init(MIX_INIT_MP3);
        Mix_OpenAudio(44100, AUDIO_S16, 2, 1024);
        Mix_AllocateChannels(16);

        isEnd = false;
    }

    /** ライブラリの終了処理.*/
    /** この関数を使用した後は速やかにプログラムを終了させなければならない。*/
    static bool End()
    {
        TTF_Quit();
        Mix_CloseAudio();
        Mix_Quit();
        SDL_Quit();
        isEnd = true;
        return true;
    }

    /** 各種更新処理をまとめて行う.*/
    static bool Update(bool 描画更新フラグ = true)
    {
        if (描画更新フラグ)
        {
            Screen::Flip();
            Screen::Clear();
        }
        bool result = System::ProcessMessage();
        Input::Update();
        return result;
    }

    /** OSのメッセージ処理を行う.*/
    /**    目安として1/60秒に一回程度、この関数を呼び出す必要があり。
        falseを返した場合、速やかにプログラムを終了させなければならない。*/    
    static bool ProcessMessage()
    {
        SDL_Event event;

        while (SDL_PollEvent(&event))
        {
            /* QUIT イベントが発生したら終了する*/
            if( event.type == SDL_WINDOWEVENT)
            {
#ifdef TABLET
switch (event.window.event)
    {
        case SDL_WINDOWEVENT_MINIMIZED:
        Mix_VolumeMusic( 0 );
            break;
        case SDL_WINDOWEVENT_RESTORED:
        Mix_VolumeMusic( Music::nowVolume );
            break;
        }
#endif
            }else if (event.type == SDL_QUIT)
            {
                isEnd = true;
            }
            else
            {
                Input::GetState(event);
            }
        }

        return !isEnd;
    }
};
}

