/*
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 "ui/cached_round_corners.h"

namespace style {
struct DialogRow;
} // namespace style

namespace st {
extern const style::DialogRow &defaultDialogRow;
} // namespace st

namespace Ui {
} // namespace Ui

namespace Data {
class Forum;
class Folder;
} // namespace Data

namespace Dialogs {
class Row;
class FakeRow;
class BasicRow;
} // namespace Dialogs

namespace Dialogs::Ui {

using namespace ::Ui;

class VideoUserpic;

struct TopicJumpCorners {
	CornersPixmaps normal;
	CornersPixmaps inverted;
	QPixmap small;
	int invertedRadius = 0;
	int smallKey = 0; // = `-radius` if top right else `radius`.
};

struct TopicJumpCache {
	TopicJumpCorners corners;
	TopicJumpCorners over;
	TopicJumpCorners selected;
	TopicJumpCorners rippleMask;
};

struct PaintContext {
	not_null<const style::DialogRow*> st;
	TopicJumpCache *topicJumpCache = nullptr;
	Data::Folder *folder = nullptr;
	Data::Forum *forum = nullptr;
	required<QBrush> currentBg;
	FilterId filter = 0;
	float64 topicsExpanded = 0.;
	crl::time now = 0;
	int width = 0;
	bool active = false;
	bool selected = false;
	bool topicJumpSelected = false;
	bool paused = false;
	bool search = false;
	bool narrow = false;
	bool displayUnreadInfo = false;
};

[[nodiscard]] const style::icon *ChatTypeIcon(
	not_null<PeerData*> peer,
	const PaintContext &context);
[[nodiscard]] const style::icon *ChatTypeIcon(not_null<PeerData*> peer);

class RowPainter {
public:
	static void Paint(
		Painter &p,
		not_null<const Row*> row,
		VideoUserpic *videoUserpic,
		const PaintContext &context);
	static void Paint(
		Painter &p,
		not_null<const FakeRow*> row,
		const PaintContext &context);
	static QRect SendActionAnimationRect(
		not_null<const style::DialogRow*> st,
		int animationLeft,
		int animationWidth,
		int animationHeight,
		int fullWidth,
		bool textUpdated);
};

void PaintCollapsedRow(
	Painter &p,
	const BasicRow &row,
	Data::Folder *folder,
	const QString &text,
	int unread,
	const PaintContext &context);

enum class UnreadBadgeSize {
	Dialogs,
	MainMenu,
	HistoryToDown,
	StickersPanel,
	StickersBox,
	TouchBar,
	ReactionInDialogs,

	kCount,
};
struct UnreadBadgeStyle {
	UnreadBadgeStyle();

	style::align align = style::al_right;
	bool active = false;
	bool selected = false;
	bool muted = false;
	int textTop = 0;
	int size = 0;
	int padding = 0;
	UnreadBadgeSize sizeId = UnreadBadgeSize::Dialogs;
	style::font font;
};

[[nodiscard]] QSize CountUnreadBadgeSize(
	const QString &unreadCount,
	const UnreadBadgeStyle &st,
	int allowDigits = 0);

QRect PaintUnreadBadge(
	QPainter &p,
	const QString &t,
	int x,
	int y,
	const UnreadBadgeStyle &st,
	int allowDigits = 0);

} // namespace Dialogs::Ui
