#ifndef RECRUITMENTSCENE_H
#define RECRUITMENTSCENE_H

#include "gui/scene.h"
#include "gui/buttoneventlistener.h"
#include "ui/hotseat_recruitment/iconhint.h"

#include <QWidget>

#include <vector>
#include <memory>

class UnitIcon;
class RaceIcon;
class Player;
class Unit;
class Race;

namespace Ui {
class RecruitmentScene;
}
class RecruitmentScene;

class RaceIconEventListener : public QObject
{
    Q_OBJECT
public:
    RaceIconEventListener() = delete;
    RaceIconEventListener(QObject *parent, RecruitmentScene* scene);
    virtual bool eventFilter(QObject * watched, QEvent * event) Q_DECL_OVERRIDE;
private:
    RecruitmentScene* scene_;
};

class UnitIconEventListener : public QObject
{
    Q_OBJECT
public:
    UnitIconEventListener() = delete;
    UnitIconEventListener(QObject *parent, RecruitmentScene* scene);
    virtual bool eventFilter(QObject * watched, QEvent * event) Q_DECL_OVERRIDE;
private:
    RecruitmentScene* scene_;

};

class RecruitmentScene : public Scene
{
    Q_OBJECT

public:
    explicit RecruitmentScene(QWidget *parent = 0);
    ~RecruitmentScene();

    /*
     * Перегруженная виртуальная функция класса Scene,
     * посредством которой сцене передаются аргументы инициализации.
     * Для данной сцены принимаются 2 аргумента, разделённые символом '|':
     * 1) Числовое значение - id объекта Player, для которого происходит набор отряда
     * 2) Числовое значение - исходное количество монет для найма/улучшения юнитов
     */

    void parseArgs(QString args) override;

    /*
     * Перегруженная виртуальная функция класса Scene.
     * Инициализирует сцену в соответствии с принятыми через parseArgs аргументами
     */

    void init() override;

private:
    void initAvailableRaces();

    void initAvailableUnits();

    void showChosenUnits();

public:
    Player *getActivePlayer();

    bool buyUnit(std::shared_ptr<Unit> unit);

    bool removeUnit(std::shared_ptr<Unit> unit);

    void changeRace(std::shared_ptr<Race> race);

    void updateMoney();

private slots:
    void on_back_button_clicked();

    void on_complete_choice_button_clicked();

public:
    /*
     * races_list - this is a vector of size = RACES_NUMBER
     * It contains pointers to races in races' icons list in GUI
     * i-th race in races' icons list has its race stored in races_list[i];
     */

    std::vector<std::shared_ptr<Race>> races_list;

    /*
     * available_units_list - this is a vector of size = AVAILABLE_UNIT_NUMBER
     * It contains pointer of each unit in available units' icons list in GUI
     * i-th unit in available units' icons list has its pointer stored in available_units_list[i];
     */

    std::vector<std::shared_ptr<Unit>> available_units_list;

    /*
     * chosen_units_list - this is a vector of size = MAX_PARTY_SIZE
     * It contains pointer of each unit in chosen units' icons list in GUI
     * i-th unit in chosen units' icons list has its name stored in chosen_units_list[i];
     */

    std::vector<std::shared_ptr<Unit>> chosen_units_list;

private:
    /*
     * available_money_ - максимальное количество монет у игрока.
     * За монеты можно нанимать и улучшать юнитов.
     * Количество монет задаётся в поле money и передаётся вторым аргументом
     * в функцию ParseArgs этой сцены. Необходимо, чтобы при смене игрока и ре-инициализации сцены
     * в неё передавать исходное количество монет для игроков
     */

    unsigned int available_money_;

    /*
     * current_money_ - текущее количество монет у игрока.
     */

    int current_money_;

    /*
     * current_player_id_ - id текущего игрока, который соответствует его id в классе PlayerManager
     */

    int current_player_id_;

    /*
     * current_player_ - указатель на объекта класса Player текущего игрока.
     * В класс Player передаются на хранение созданные юниты
     */

    Player* current_player_;

    /*
     * movie - объект класса QMovie, отвечающий за воспроизведение gif-анимации
     * на графическом объекте QLabel image
     */

    QMovie *movie;

    /*
     * Указатель на объект класса обработчика кнопок, отвечающего за изменение
     * кнопок при нажатии и наведении на них курсора мыши
     */

    ButtonEventListener *watcher;

    /*
     * Указатель на объект класса обработчика расовых кнопок-объектов QLabel,
     * отвечающего за действия при наведении курсора и нажатии на "кнопки" рас.
     */

    RaceIconEventListener *race_icon_watcher;

    /*
     * Указатель на объект класса обработчика расовых кнопок-объектов QLabel,
     * отвечающего за действия при наведении курсора и нажатии на "кнопки" юнитов.
     */

    UnitIconEventListener *unit_icon_watcher;

    /*
     * Указатель на объект корневого элемента графического интерфейса сцены,
     * созданной посредством QtDesigner
     */


    Ui::RecruitmentScene *ui;
};

#endif // RECRUITMENTSCENE_H
