#pragma once
#include "../irda-app.hpp"
#include <api-hal-irda.h>
#include "irda.h"
#include <gui/elements.h>
#include <vector>
#include <string>

class IrdaApp;

class IrdaAppScene {
public:
    virtual void on_enter(IrdaApp* app) = 0;
    virtual bool on_event(IrdaApp* app, IrdaAppEvent* event) = 0;
    virtual void on_exit(IrdaApp* app) = 0;
    virtual ~IrdaAppScene(){};

private:
};

class IrdaAppSceneStart : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
private:
    uint32_t submenu_item_selected = 0;
};

class IrdaAppSceneUniversal : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
private:
    uint32_t submenu_item_selected = 0;
};

class IrdaAppSceneLearn : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
};

class IrdaAppSceneLearnSuccess : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
};

class IrdaAppSceneLearnEnterName : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
};

class IrdaAppSceneLearnDone : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
};

class IrdaAppSceneLearnDoneAfter : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
};

class IrdaAppSceneRemote : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
private:
    std::vector<std::string> buttons_names;
    uint32_t buttonmenu_item_selected = 0;
};

class IrdaAppSceneRemoteList : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
private:
    uint32_t submenu_item_selected = 0;
    std::vector<std::string> remote_names;
};

class IrdaAppSceneEdit : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
private:
    uint32_t submenu_item_selected = 0;
};

class IrdaAppSceneEditKeySelect : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
private:
    std::vector<std::string> buttons_names;
};

class IrdaAppSceneEditRename : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
};

class IrdaAppSceneEditDelete : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
};

class IrdaAppSceneEditRenameDone : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
};

class IrdaAppSceneEditDeleteDone : public IrdaAppScene {
public:
    void on_enter(IrdaApp* app) final;
    bool on_event(IrdaApp* app, IrdaAppEvent* event) final;
    void on_exit(IrdaApp* app) final;
};