/*
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/effects/animations.h"

namespace style {
struct RoundCheckbox;
struct RoundImageCheckbox;
} // namespace style

class Painter;
enum class ImageRoundRadius;

namespace Ui {

struct OutlineSegment;

class RoundCheckbox {
public:
	RoundCheckbox(const style::RoundCheckbox &st, Fn<void()> updateCallback);

	void paint(QPainter &p, int x, int y, int outerWidth, float64 masterScale = 1.) const;

	void setDisplayInactive(bool displayInactive);
	bool checked() const {
		return _checked;
	}
	void setChecked(
		bool newChecked,
		anim::type animated = anim::type::normal);
	void finishAnimating();

	void invalidateCache();

private:
	void prepareInactiveCache();

	const style::RoundCheckbox &_st;
	Fn<void()> _updateCallback;

	bool _checked = false;
	Ui::Animations::Simple _checkedProgress;

	bool _displayInactive = false;
	QPixmap _inactiveCacheBg, _inactiveCacheFg;

};

class RoundImageCheckbox {
public:
	using PaintRoundImage = Fn<void(
		Painter &p,
		int x,
		int y,
		int outerWidth,
		int size)>;
	RoundImageCheckbox(
		const style::RoundImageCheckbox &st,
		Fn<void()> updateCallback,
		PaintRoundImage &&paintRoundImage,
		Fn<std::optional<int>(int size)> roundingRadius = nullptr);
	RoundImageCheckbox(RoundImageCheckbox&&);
	~RoundImageCheckbox();

	void paint(Painter &p, int x, int y, int outerWidth) const;
	float64 checkedAnimationRatio() const;

	void setColorOverride(std::optional<QBrush> fg);
	void setCustomizedSegments(
		std::vector<OutlineSegment> segments,
		bool liveBadge);

	bool checked() const {
		return _check.checked();
	}
	void setChecked(
		bool newChecked,
		anim::type animated = anim::type::normal);

	void invalidateCache() {
		_check.invalidateCache();
	}

private:
	void prepareWideCache();
	void paintFrame(Painter &p, int x, int y, int outerWidth) const;

	const style::RoundImageCheckbox &_st;
	Fn<void()> _updateCallback;
	PaintRoundImage _paintRoundImage;
	Fn<std::optional<int>(int size)> _roundingRadius;

	QPixmap _wideCache;
	Ui::Animations::Simple _selection;

	RoundCheckbox _check;

	//std::optional<QBrush> _fgOverride;
	std::vector<OutlineSegment> _segments;

	mutable QImage _liveBadgeCache;
	bool _liveBadge = false;

};

void PaintLiveBadge(
	QPainter &p,
	int x,
	int y,
	int photoSize,
	std::optional<QColor> outline = std::nullopt);

} // namespace Ui
