#include "eleborder.h"
#include <QJsonObject>
#include <QPainter>
#include <QPainterPath>
#include <QTimerEvent>

EleBorder::EleBorder(QString path, QString eff, int speed, QWidget *parent) : QWidget{parent}, speed(speed) {
    img.load(path);
    if(eff.startsWith("ro")) this->eff = 'r';
    else if(eff.startsWith("bl")) this->eff = 'b';
}

void EleBorder::paintEvent(QPaintEvent *) {
    if(eff=='b' && off > 0) return;
    if(timerId==0) {
        if(eff=='r') timerId = startTimer(speed==1 ? 66 : (speed==2 ? 33 : 16), Qt::PreciseTimer);
        else if(eff=='b') timerId = startTimer(speed==1 ? 500 : (speed==2 ? 250 : 66));
    }
    int bdWidth = img.height();
    int halfBdWidth = (bdWidth+1)/2;
    QBrush brush(img);
    QTransform transTop = QTransform::fromTranslate(halfBdWidth+off, 0);
    QTransform transRight = QTransform::fromTranslate(width() - bdWidth, halfBdWidth*3-width()+off);
    transRight.rotate(90);
    QTransform transBottom = QTransform::fromTranslate(halfBdWidth*3-height()-off, height() - bdWidth);
    transBottom.rotate(180);
    QTransform transLeft = QTransform::fromTranslate(0, halfBdWidth-off);
    transLeft.rotate(270);

    QPainter painter(this);
    brush.setTransform(transTop);
    QPainterPath path(QPointF(0, 0));
    path.lineTo(width(), 0);
    path.lineTo(width() - bdWidth, bdWidth);
    path.lineTo(bdWidth, bdWidth);
    path.closeSubpath();
    painter.fillPath(path, brush);

    brush.setTransform(transRight);
    path = QPainterPath(QPointF(width(), 0));
    path.lineTo(width(), height());
    path.lineTo(width() - bdWidth, height() - bdWidth);
    path.lineTo(width() - bdWidth, bdWidth);
    path.closeSubpath();
    painter.fillPath(path, brush);

    brush.setTransform(transBottom);
    path = QPainterPath(QPointF(width(), height()));
    path.lineTo(0, height());
    path.lineTo(bdWidth, height() - bdWidth);
    path.lineTo(width() - bdWidth, height() - bdWidth);
    path.closeSubpath();
    painter.fillPath(path, brush);

    brush.setTransform(transLeft);
    path = QPainterPath(QPointF(0, height()));
    path.lineTo(0, 0);
    path.lineTo(bdWidth, bdWidth);
    path.lineTo(bdWidth, height() - bdWidth);
    path.closeSubpath();
    painter.fillPath(path, brush);

}

void EleBorder::timerEvent(QTimerEvent *) {
    if(isVisible()) {
        if(eff=='r') {
            if(off >= img.width() - 1) off = 0;
            else off++;
        } else off = off==0 ? 1 : 0;
        update();
    } else if(timerId!=0) {
        killTimer(timerId);
        timerId = 0;
    }
}
