#pragma once

#include <string>
#include "thirdparty/SDL2/SDL2.h"

#include "client/app/AppPlatform.hpp"

#include "client/player/input/Mouse.hpp"
#include "client/player/input/Keyboard.hpp"
#include "common/Logger.hpp"

class AppPlatform_sdl_base : public AppPlatform
{
public:
    void _init(std::string storageDir, SDL_Window *window);
	AppPlatform_sdl_base(std::string storageDir, SDL_Window *window)
    {
        _init(storageDir, window);
    }
	~AppPlatform_sdl_base();

	void initSoundSystem() override;

	int checkLicense() override;
	const char* const getWindowTitle() const;
	int getScreenWidth() const override;
	int getScreenHeight() const override;
	Texture loadTexture(const std::string& path, bool b = false) override = 0;
	int getUserInputStatus() override;
	SoundSystem* const getSoundSystem() const override { return m_pSoundSystem; }
	
	// Also add these to allow proper turning within the game.
	void setMouseGrabbed(bool b) override;
	void setMouseDiff(int x, int y);
	void getMouseDiff(int& x, int& y) override;
	void clearDiff() override;

	// Also add these to allow proper text input within the game.
	bool shiftPressed() override;
	void setShiftPressed(bool b, bool isLeft);
	
	bool isTouchscreen() override { return false; }

	static MouseButtonType GetMouseButtonType(SDL_Event event);
	static bool GetMouseButtonState(SDL_Event event);
	static Keyboard::KeyState GetKeyState(SDL_Event event);
private:
	SDL_Window *_window;

	const Texture *_iconTexture;
	SDL_Surface *_icon;

	bool m_bShiftPressed[2];

	int xrel;
	int yrel;

	Logger* m_pLogger;
	SoundSystem* m_pSoundSystem;

	static SDL_Surface* getSurfaceForTexture(const Texture* const texture);
protected:
	std::string _storageDir;

	virtual void ensureDirectoryExists(const char* path) { }

	void setIcon(const Texture& icon); // note: this takes ownership of the texture, so no memory leaks!
};
