/***************************************************************************
 * Copyright (C) 2018 by Savoir-faire Linux                                *
 * Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>          *
 *                                                                         *
 * This program is free software; you can redistribute it and/or modify    *
 * it under the terms of the GNU General Public License as published by    *
 * the Free Software Foundation; either version 3 of the License, or       *
 * (at your option) any later version.                                     *
 *                                                                         *
 * This program is distributed in the hope that it will be useful,         *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
 * GNU General Public License for more details.                            *
 *                                                                         *
 * You should have received a copy of the GNU General Public License       *
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.   *
 **************************************************************************/

#include "animationhelpers.h"

#include "ui_animatedoverlay.h"

#include <QTimer>
#include <QtMath>

OpacityAnimation::OpacityAnimation(QWidget* target, QObject* parent)
    : QObject(parent),
    target_(target),
    timer_(nullptr),
    frameTime_((1.0 / 24.0) * 1000),
    startValue_(0.0),
    endValue_(1.0),
    t_(0),
    value_(0),
    duration_(1000)
{
    timer_ = new QTimer(this);
    connect(timer_, SIGNAL(timeout()), this, SLOT(updateAnimation()));

    effect_ = new QGraphicsOpacityEffect(this);
    effect_->setOpacity(startValue_);

    target_->setGraphicsEffect(effect_);
    target_->setAutoFillBackground(true);
}

OpacityAnimation::~OpacityAnimation()
{
}

void
OpacityAnimation::setFPS(const int& fps)
{
    frameTime_ = (1.0 / static_cast<double>(fps)) * 1000;
}

void
OpacityAnimation::setFrameTime(const int& milliseconds)
{
    frameTime_ = milliseconds;
}

void
OpacityAnimation::setDuration(const int& milliseconds)
{
    duration_ = milliseconds;
}

void
OpacityAnimation::setStartValue(const double& value)
{
    startValue_ = value;
    effect_->setOpacity(startValue_);
}

void
OpacityAnimation::setEndValue(const double& value)
{
    endValue_ = value;
}

void
OpacityAnimation::start()
{
    timer_->start(frameTime_);
}

void
OpacityAnimation::stop()
{
    timer_->stop();
}

void
OpacityAnimation::updateAnimation()
{
    double d = (startValue_ + endValue_) * 0.5;
    double a = abs(startValue_ - endValue_) * 0.5;

    t_ += frameTime_;
    value_ = a * sin(2 * M_PI * t_ * duration_ * .000001) + d;
    effect_->setOpacity(value_);
    target_->update();
}

AnimatedOverlay::AnimatedOverlay(QColor color, QWidget* parent) :
    QWidget(parent),
    ui(new Ui::AnimatedOverlay)
{
    ui->setupUi(this);
    ui->backgroundLabel->setAutoFillBackground(true);
    auto values = QString("%1,%2,%3,255")
        .arg(color.red())
        .arg(color.green())
        .arg(color.blue());
    ui->backgroundLabel->setStyleSheet("background-color: rgba(" + values + ");");

    oa_ = new OpacityAnimation(this, this);
    oa_->setFPS(16);
    oa_->setDuration(1000);
    oa_->setStartValue(0.0);
    oa_->setEndValue(0.25);
    oa_->start();
}

AnimatedOverlay::~AnimatedOverlay()
{
    disconnect(this);
    delete ui;
}
