/*
 * Copyright (C) Kreogist Dev Team
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

#ifndef GROUNDREALTIMEPREVIEWER_H
#define GROUNDREALTIMEPREVIEWER_H

#include "groundpreviewer.h"

class Robot;
class Enemy;
class GroundBase;
/*!
 * \brief The GroundRealtimePreview class is a advanced ground preview. It can
 * preview a ground data in real-time. This means you have to set a GroundBase
 * to the previewer.
 */
class GroundRealtimePreviewer : public GroundPreviewer
{
    Q_OBJECT
public:
    /*!
     * \brief Construct a GroundRealtimePreviewer.
     * \param parent The parent widget.
     */
    explicit GroundRealtimePreviewer(QWidget *parent = 0);

    /*!
     * \brief Destory the GroundRealtimePreviewer.
     */
    ~GroundRealtimePreviewer();

    /*!
     * \brief The display exist robots setting.
     * \return If display the exist robot, it will be true, or else false.
     */
    bool displayRobots() const;

    /*!
     * \brief Get the selected robot. The robot will display the parameter.
     * \return The selected robot.
     */
    Robot *selectedRobot() const;

    /*!
     * \brief The display exists enemys setting.
     * \return If display the exist enemy, it will be true, or else false.
     */
    bool displayEnemies() const;


signals:

public slots:
    /*!
     * \brief Set the rendering Ground class.
     * \param ground The render ground.
     */
    void setGround(GroundBase *ground);

    /*!
     * \brief Set the previewer will display or hide the exist enemys.
     * \param displayEnemys To display the exist enemys, set it true, or else
     * false.
     */
    void setDisplayEnemies(bool displayEnemies);

    /*!
     * \brief Set the previewer will display or hide the exist robots.
     * \param displayRobots To display the exist robots, set it true, or else
     * false.
     */
    void setDisplayRobots(bool displayRobots);

    /*!
     * \brief Set the selected enemy.
     * \param selectedEnemy The enemy which will be selected. To cancel the
     * selection please set a nullptr.
     */
    void setSelectedEnemy(Enemy *selectedEnemy);

    /*!
     * \brief Set the selected robot.
     * \param selectedRobot The robot which will be selected. To cancel the
     * selection please set a nullptr.
     */
    void setSelectedRobot(Robot *selectedRobot);

    /*!
     * \brief Update the enemy position list.
     * \param positions The position list.
     */
    void setEnemyPositionList(const QList<QPointF> &positions);

    /*!
     * \brief Update all kinds of preview list info about enemy.
     * \param enemys The enemy list.
     * \param positions The position list.
     */
    void setEnemyPreviewList(const QList<Enemy *> &enemys,
                             const QList<QPointF> &positions);

    /*!
     * \brief Update the position list.
     * \param positions The position list
     */
    void setPositionList(const QList<QPointF> &positions);

    /*!
     * \brief Update the angle list.
     * \param angles The angle list.
     */
    void setAngleList(const QList<qreal> &angles);

    /*!
     * \brief Update all kinds of preview list.
     * \param robots The robot list.
     * \param positions The positions list.
     * \param angles The angle list.
     */
    void setRobotsPreviewList(const QList<Robot *> &robots,
                              const QList<QPointF> &positions,
                              const QList<qreal> &angles);

protected:
    /*!
     * \brief Reimplemented from GroundPreviewer::paintEvent().
     */
    void paintEvent(QPaintEvent *event);

private slots:
    void onActionBorderChanged();
    void onActionBarracksChanged();

private:
    Robot *m_proxyRobot;
    Enemy *m_proxyEnemy;
    GroundBase *m_ground;
    bool m_displayRobots, m_displayEnemies;
    Robot *m_selectedRobot;
    Enemy *m_selectedEnemy;

    QList<Enemy *> m_enemies;
    QList<QPointF> m_enemyPositions;
    QList<Robot *> m_robots;
    QList<QPointF> m_positions;
    QList<qreal> m_angles;
};

#endif // GROUNDREALTIMEPREVIEWER_H