/*
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
*/
#include "info/feed/info_feed_cover.h"

#include "data/data_feed.h"
#include "data/data_session.h"
#include "info/info_controller.h"
#include "info/info_memento.h"
#include "lang/lang_keys.h"
#include "ui/widgets/labels.h"
#include "ui/special_buttons.h"
#include "auth_session.h"
#include "styles/style_info.h"

namespace Info {
namespace FeedProfile {

Cover::Cover(
	QWidget *parent,
	not_null<Controller*> controller)
: FixedHeightWidget(
	parent,
	st::infoProfilePhotoTop
		+ st::infoProfilePhoto.size.height()
		+ st::infoProfilePhotoBottom)
, _controller(controller)
, _feed(_controller->key().feed())
, _userpic(
	this,
	controller->parentController(),
	_feed,
	st::infoFeedProfilePhoto)
, _name(this, st::infoProfileNameLabel)
, _status(
		this,
		st::infoProfileMegagroupStatusLabel) {
	_userpic->setPointerCursor(false);
	_name->setSelectable(true);
	_name->setContextCopyText(lang(lng_profile_copy_fullname));
	refreshNameText();
	refreshStatusText();

	initViewers();
	setupChildGeometry();
}

void Cover::setupChildGeometry() {
	widthValue(
	) | rpl::start_with_next([=](int newWidth) {
		_userpic->moveToLeft(
			st::infoProfilePhotoLeft,
			st::infoProfilePhotoTop,
			newWidth);
		refreshNameGeometry(newWidth);
		refreshStatusGeometry(newWidth);
	}, lifetime());
}

void Cover::initViewers() {
	Auth().data().feedUpdated(
	) | rpl::filter([](const Data::FeedUpdate &update) {
		return (update.flag == Data::FeedUpdateFlag::Channels);
	}) | rpl::start_with_next(
		[=] { refreshStatusText(); },
		lifetime());
}

void Cover::refreshNameText() {
	_name->setText(_feed->chatsListName());
	refreshNameGeometry(width());
}

void Cover::refreshStatusText() {
	const auto statusText = [&] {
		if (!_feed->channelsLoaded() || _feed->channels().empty()) {
			return QString();
		}
		return lng_feed_channels(lt_count, _feed->channels().size());
	}();
	_status->setRichText(textcmdLink(1, statusText));
	_status->setLink(1, std::make_shared<LambdaClickHandler>([=] {
		_controller->showSection(Info::Memento(
			_feed,
			Section::Type::Channels));
	}));
	refreshStatusGeometry(width());
}

void Cover::refreshNameGeometry(int newWidth) {
	auto nameLeft = st::infoProfileNameLeft;
	auto nameTop = st::infoProfileNameTop;
	auto nameWidth = newWidth
		- nameLeft
		- st::infoProfileNameRight;
	_name->resizeToNaturalWidth(nameWidth);
	_name->moveToLeft(nameLeft, nameTop, newWidth);
}

void Cover::refreshStatusGeometry(int newWidth) {
	auto statusWidth = newWidth
		- st::infoProfileStatusLeft
		- st::infoProfileStatusRight;
	_status->resizeToWidth(statusWidth);
	_status->moveToLeft(
		st::infoProfileStatusLeft,
		st::infoProfileStatusTop,
		newWidth);
}

Cover::~Cover() = default;

} // namespace FeedProfile
} // namespace Info