#ifndef __INCLUDED_DX9_HOOK_H__
#define __INCLUDED_DX9_HOOK_H__

#include <d3d9.h>
#include "DirectX_VTables.h"
#include "Base_Hook.h"

class DX9_Hook : public Base_Hook
{
public:
    static constexpr const char DLL_NAME[] = "d3d9.dll";

private:
    // Variables
    bool initialized;
    bool uses_present;

    // Functions
    DX9_Hook();
    virtual ~DX9_Hook();

    void hook_dx9(UINT SDKVersion);
    void resetRenderState();
    void prepareForOverlay(IDirect3DDevice9* pDevice);

    // Hook to render functions
    decltype(&IDirect3DDevice9::Reset)       Reset;
    decltype(&IDirect3DDevice9::EndScene)    EndScene;
    decltype(&IDirect3DDevice9::Present)     Present;
    decltype(&IDirect3DDevice9Ex::PresentEx) PresentEx;

    static HRESULT STDMETHODCALLTYPE MyReset(IDirect3DDevice9* _this, D3DPRESENT_PARAMETERS* pPresentationParameters);
    static HRESULT STDMETHODCALLTYPE MyEndScene(IDirect3DDevice9 *_this);
    static HRESULT STDMETHODCALLTYPE MyPresent(IDirect3DDevice9* _this, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion);
    static HRESULT STDMETHODCALLTYPE MyPresentEx(IDirect3DDevice9Ex* _this, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags);

    // Hook functions so we know we use DX9
    static decltype(Direct3DCreate9) MyDirect3DCreate9;
    static decltype(Direct3DCreate9Ex) MyDirect3DCreate9Ex;

    decltype(Direct3DCreate9)* Direct3DCreate9;
    decltype(Direct3DCreate9Ex)* Direct3DCreate9Ex;

public:
    static void Create(); // Initialize DX9 Hook.
    
    void loadFunctions(IDirect3DDevice9Ex *pDeviceEx);
};

#endif//__INCLUDED_DX9_HOOK_H__