#pragma once

#ifndef BOARDSETTINGSPOPUP_H
#define BOARDSETTINGSPOPUP_H

#include "toonzqt/dvdialog.h"
#include "tpixel.h"
#include "filebrowserpopup.h"
#include <QWidget>
#include <QStackedWidget>

class TOutputProperties;
class QLineEdit;
class QTextEdit;
class QComboBox;
class QFontComboBox;
class QListWidget;
class BoardItem;

namespace DVGui {
class FileField;
class ColorField;
class IntLineEdit;
}  // namespace DVGui

//=============================================================================

class BoardView : public QWidget {
  Q_OBJECT

  enum DragItem {
    None = 0,
    Translate,
    TopLeftCorner,
    TopRightCorner,
    BottomRightCorner,
    BottomLeftCorner,
    TopEdge,
    RightEdge,
    BottomEdge,
    LeftEdge
  } m_dragItem = None;

  QImage m_boardImg;
  bool m_valid = false;

  QRectF m_boardImgRect;

  QRectF m_dragStartItemRect;
  QPointF m_dragStartPos;

public:
  BoardView(QWidget* parent = nullptr);
  void invalidate() { m_valid = false; }
  const QImage& boardImage() { return m_boardImg; }

protected:
  void paintEvent(QPaintEvent* event) override;
  void resizeEvent(QResizeEvent* event) override;

  void mouseMoveEvent(QMouseEvent* event) override;
  void mousePressEvent(QMouseEvent* event) override;
  void mouseReleaseEvent(QMouseEvent* event) override;
};

//=============================================================================

class ItemInfoView : public QStackedWidget {
  Q_OBJECT

  QLineEdit* m_nameEdit;
  DVGui::IntLineEdit* m_maxFontSizeEdit;
  QComboBox* m_typeCombo;
  QTextEdit* m_textEdit;
  DVGui::FileField* m_imgPathField;
  QFontComboBox* m_fontCombo;
  QPushButton *m_boldButton, *m_italicButton;
  DVGui::ColorField* m_fontColorField;
  QComboBox* m_imgARModeCombo;

  QWidget *m_fontPropBox, *m_imgPropBox;

public:
  ItemInfoView(QWidget* parent = nullptr);
  void setCurrentItem(int index);

protected slots:
  void onNameEdited();
  void onMaxFontSizeEdited();
  void onTypeComboActivated(int);
  void onFreeTextChanged();
  void onImgPathChanged();
  void onFontComboChanged(const QFont&);
  void onBoldButtonClicked(bool);
  void onItalicButtonClicked(bool);
  void onFontColorChanged(const TPixel32&, bool);
  void onImgARModeComboActivated();

signals:
  // if updateListView is true then update the list view as well
  void itemPropertyChanged(bool updateListView);
};

//=============================================================================

class ItemListView : public QWidget {
  Q_OBJECT
  QListWidget* m_list;
  QPushButton *m_deleteItemBtn, *m_moveUpBtn, *m_moveDownBtn;

public:
  ItemListView(QWidget* parent = nullptr);
  void initialize();
  void updateCurrentItem();
protected slots:
  void onCurrentItemSwitched(int);
  void onNewItemButtonClicked();
  void onDeleteItemButtonClicked();
  void onMoveUpButtonClicked();
  void onMoveDownButtonClicked();
signals:
  void currentItemSwitched(int);
  void itemAddedOrDeleted();
};

//=============================================================================

class BoardSettingsPopup : public DVGui::Dialog {
  Q_OBJECT

  BoardView* m_boardView;
  ItemInfoView* m_itemInfoView;
  ItemListView* m_itemListView;

  DVGui::IntLineEdit* m_durationEdit;
  DVGui::LineEdit* m_fileNameSuffixFld;
  QPushButton* m_exportBoardBtn;

  void initialize();
  void initializeItemTypeString();  // call once on the first launch
public:
  static BoardItem* currentBoardItem;

  BoardSettingsPopup(QWidget* parent = nullptr);

protected:
  void showEvent(QShowEvent*) override { initialize(); }
  void hideEvent(QHideEvent*) override;
protected slots:
  void onCurrentItemSwitched(int);
  void onItemAddedOrDeleted();
  void onItemPropertyChanged(bool updateListView);
  void onDurationEdited();
  void onFileNameSuffixEdited();
  void onLoadPreset();
  void onSavePreset();
  void onExportBoardImage();
};

//=============================================================================

class SaveBoardPresetFilePopup final : public GenericSaveFilePopup {
  Q_OBJECT
public:
  SaveBoardPresetFilePopup();

protected:
  void showEvent(QShowEvent*) override;
};

//=============================================================================

class LoadBoardPresetFilePopup final : public GenericLoadFilePopup {
  Q_OBJECT
public:
  LoadBoardPresetFilePopup();

protected:
  void showEvent(QShowEvent*) override;
};

//=============================================================================

class SaveBoardImagePopup final : public GenericSaveFilePopup {
  Q_OBJECT

public:
  SaveBoardImagePopup();
};
#endif
