#include "TitlebarButton.hpp"

#include "BaseTheme.hpp"

namespace AB_NAMESPACE {

TitleBarButton::TitleBarButton()
    : Button(nullptr)
{
}

TitleBarButtonStyle TitleBarButton::getButtonStyle() const
{
    return this->style_;
}

void TitleBarButton::setButtonStyle(TitleBarButtonStyle _style)
{
    this->style_ = _style;
    this->update();
}

void TitleBarButton::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    painter.setOpacity(this->getCurrentDimAmount());

    QColor color = this->theme->window.text;
    QColor background = this->theme->window.background;

    int xD = this->height() / 3;
    int centerX = this->width() / 2;

    painter.setRenderHint(QPainter::Antialiasing, false);

    switch (this->style_)
    {
        case TitleBarButtonStyle::Minimize:
        {
            painter.fillRect(centerX - xD / 2, xD * 3 / 2, xD, 1, color);
            break;
        }
        case TitleBarButtonStyle::Maximize:
        {
            painter.setPen(color);
            painter.drawRect(centerX - xD / 2, xD, xD - 1, xD - 1);
            break;
        }
        case TitleBarButtonStyle::Unmaximize:
        {
            int xD2 = xD * 1 / 5;
            int xD3 = xD * 4 / 5;

            painter.drawRect(centerX - xD / 2 + xD2, xD, xD3, xD3);
            painter.fillRect(centerX - xD / 2, xD + xD2, xD3, xD3,
                             this->theme->window.background);
            painter.drawRect(centerX - xD / 2, xD + xD2, xD3, xD3);
            break;
        }
        case TitleBarButtonStyle::Close:
        {
            QRect rect(centerX - xD / 2, xD, xD - 1, xD - 1);
            painter.setPen(QPen(color, 1));

            painter.drawLine(rect.topLeft(), rect.bottomRight());
            painter.drawLine(rect.topRight(), rect.bottomLeft());
            break;
        }
        case TitleBarButtonStyle::User:
        {
            color = "#999";

            painter.setRenderHint(QPainter::Antialiasing);
            painter.setRenderHint(QPainter::HighQualityAntialiasing);

            auto a = xD / 3;
            QPainterPath path;

            painter.save();
            painter.translate(3, 3);

            path.arcMoveTo(a, 4 * a, 6 * a, 6 * a, 0);
            path.arcTo(a, 4 * a, 6 * a, 6 * a, 0, 180);

            painter.fillPath(path, color);

            painter.setBrush(background);
            painter.drawEllipse(2 * a, 1 * a, 4 * a, 4 * a);

            painter.setBrush(color);
            painter.drawEllipse(2.5 * a, 1.5 * a, 3 * a + 1, 3 * a);
            painter.restore();

            break;
        }
        case TitleBarButtonStyle::Settings:
        {
            color = "#999";
            painter.setRenderHint(QPainter::Antialiasing);
            painter.setRenderHint(QPainter::HighQualityAntialiasing);

            painter.save();
            painter.translate(3, 3);

            auto a = xD / 3;
            QPainterPath path;

            path.arcMoveTo(a, a, 6 * a, 6 * a, 0 - (360 / 32.0));

            for (int i = 0; i < 8; i++)
            {
                path.arcTo(a, a, 6 * a, 6 * a, i * (360 / 8.0) - (360 / 32.0),
                           (360 / 32.0));
                path.arcTo(2 * a, 2 * a, 4 * a, 4 * a,
                           i * (360 / 8.0) + (360 / 32.0), (360 / 32.0));
            }

            painter.strokePath(path, color);
            painter.fillPath(path, color);

            painter.setBrush(background);
            painter.drawEllipse(3 * a, 3 * a, 2 * a, 2 * a);
            painter.restore();
            break;
        }
        default:;
    }

    Button::paintEvent(event);
    //    this->fancyPaint(painter);
}

}  // namespace AB_NAMESPACE
