using Mine2d.engine;
using Mine2d.engine.system;
using Mine2d.engine.system.annotations;
using Mine2d.game.frontend.inventory;
using Mine2d.game.state;

namespace Mine2d.game.frontend.events;

public class InventoryInput
{
    [EventListener(EventType.KeyDown)]
    public static void OnKeyDownSwitchHotbar(SDL_Event e)
    {
        var frontendGameState = Context.Get().FrontendGameState;
        frontendGameState.HotbarIndex = e.key.keysym.sym switch
        {
            SDL_Keycode.SDLK_1 => 0,
            SDL_Keycode.SDLK_2 => 1,
            SDL_Keycode.SDLK_3 => 2,
            SDL_Keycode.SDLK_4 => 3,
            SDL_Keycode.SDLK_5 => 4,
            SDL_Keycode.SDLK_6 => 5,
            SDL_Keycode.SDLK_7 => 6,
            SDL_Keycode.SDLK_8 => 7,
            SDL_Keycode.SDLK_9 => 8,
            _ => frontendGameState.HotbarIndex
        };
    }

    [EventListener(EventType.MouseWheel)]
    public static void OnMouseWheel(SDL_Event e)
    {
        var frontendGameState = Context.Get().FrontendGameState;
        frontendGameState.HotbarIndex -= e.wheel.y;
        if (frontendGameState.HotbarIndex < 0)
        {
            frontendGameState.HotbarIndex = 8;
        }
        if (frontendGameState.HotbarIndex > 8)
        {
            frontendGameState.HotbarIndex = 0;
        }
    }

    [EventListener(EventType.KeyDown, EventPriority.Highest)]
    public static void OnKeyDownOpenInventory(SDL_Event e)
    {
        var frontendGameState = Context.Get().FrontendGameState;
        if(e.key.keysym.sym == SDL_Keycode.SDLK_TAB)
        {
            if(frontendGameState.OpenInventory == InventoryKind.None) {
                frontendGameState.OpenInventory = InventoryKind.Player;
            } else {
                frontendGameState.OpenInventory = InventoryKind.None;
            }
        }
        if(e.key.keysym.sym == SDL_Keycode.SDLK_ESCAPE)
        {
            frontendGameState.OpenInventory = InventoryKind.None;
        }
        if(frontendGameState.OpenInventory != InventoryKind.None)
        {
            throw new CancelEventException();
        }
    }

    [EventListener(EventType.KeyUp, EventPriority.Highest)]
    public static void OnKeyUpOpenInventory(SDL_Event _)
    {
        var frontendGameState = Context.Get().FrontendGameState;
        if(frontendGameState.OpenInventory != InventoryKind.None)
        {
            throw new CancelEventException();
        }
    }

    [EventListener(EventType.MouseButtonDown, EventPriority.Highest)]
    public static void OnMouseButtonDownOpenInventory(SDL_Event e)
    {
        var frontendGameState = Context.Get().FrontendGameState;
        Context.Get().InventoryRegistry.GetInventory(frontendGameState.OpenInventory)?.OnClick(e);
        if(frontendGameState.OpenInventory != InventoryKind.None)
        {
            throw new CancelEventException();
        }
    }
}
