/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.

For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once

#include "base/timer.h"
#include "base/unique_qptr.h"
#include "editor/scene/scene_item_base.h"

namespace Ui {
class PopupMenu;
} // namespace Ui

namespace Editor {

enum class TextStyle : uchar {
	Framed,
	SemiTransparent,
	Plain,
};

[[nodiscard]] QColor EffectiveTextColor(const QColor &color, TextStyle style);

class ItemText : public ItemBase {
public:
	enum { Type = ItemBase::Type + 2 };

	ItemText(
		const QString &text,
		const QColor &color,
		float64 fontSize,
		TextStyle style,
		const QSize &imageSize,
		ItemBase::Data data);

	void paint(
		QPainter *p,
		const QStyleOptionGraphicsItem *option,
		QWidget *widget) override;
	int type() const override;

	[[nodiscard]] const QString &text() const;
	void setText(const QString &text);

	[[nodiscard]] const QColor &color() const;
	void setColor(const QColor &color);

	[[nodiscard]] float64 fontSize() const;

	[[nodiscard]] TextStyle textStyle() const;
	void setTextStyle(TextStyle style);

	[[nodiscard]] float64 editScale() const;

	[[nodiscard]] static QSize computeContentSize(
		const QString &text,
		float64 fontSize,
		const QSize &imageSize,
		TextStyle style);

	void save(SaveState state) override;
	void restore(SaveState state) override;

protected:
	void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
	void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
	void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
	void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override;
	void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override;
	void performFlip() override;
	std::shared_ptr<ItemBase> duplicate(ItemBase::Data data) const override;

private:
	void renderContent();

	QString _text;
	QColor _color;
	float64 _fontSize;
	TextStyle _textStyle = TextStyle::Plain;
	QSize _imageSize;
	QPixmap _pixmap;
	base::unique_qptr<Ui::PopupMenu> _contextMenu;
	QPointF _textStyleClickItemPosition;
	TextStyle _textStyleClickInitialStyle = TextStyle::Plain;
	base::Timer _textStyleClickTimer;
	bool _textStyleClickCandidate = false;
	bool _textStyleClickDragging = false;
	bool _textStyleClickChanged = false;

	struct SavedText {
		QString text;
		QColor color;
		float64 fontSize = 0.;
		TextStyle textStyle = TextStyle::Plain;
	};
	SavedText _savedState, _keepedState;
};

} // namespace Editor
