#include "selfdrive/ui/qt/widgets/toggle.h"

#include <QPainter>

Toggle::Toggle(QWidget *parent) : QAbstractButton(parent),
_height(80),
_height_rect(60),
on(false),
_anim(new QPropertyAnimation(this, "offset_circle", this))
{
  _radius = _height / 2;
  _x_circle = _radius;
  _y_circle = _radius;
  _y_rect = (_height - _height_rect)/2;
  circleColor = QColor(0xffffff); // placeholder
  green = QColor(0xffffff); // placeholder
  setEnabled(true);
}

void Toggle::paintEvent(QPaintEvent *e) {
  this->setFixedHeight(_height);
  QPainter p(this);
  p.setPen(Qt::NoPen);
  p.setRenderHint(QPainter::Antialiasing, true);

  // Draw toggle background left
  p.setBrush(green);
  p.drawRoundedRect(QRect(0, _y_rect, _x_circle + _radius, _height_rect), _height_rect/2, _height_rect/2);

  // Draw toggle background right
  p.setBrush(QColor(0x393939));
  p.drawRoundedRect(QRect(_x_circle - _radius, _y_rect, width() - (_x_circle - _radius), _height_rect), _height_rect/2, _height_rect/2);

  // Draw toggle circle
  p.setBrush(circleColor);
  p.drawEllipse(QRectF(_x_circle - _radius, _y_circle - _radius, 2 * _radius, 2 * _radius));
}

void Toggle::mouseReleaseEvent(QMouseEvent *e) {
  if (!enabled) {
    return;
  }
  const int left = _radius;
  const int right = width() - _radius;
  if ((_x_circle != left && _x_circle != right) || !this->rect().contains(e->localPos().toPoint())) {
    // If mouse release isn't in rect or animation is running, don't parse touch events
    return;
  }
  if (e->button() & Qt::LeftButton) {
    togglePosition();
    emit stateChanged(on);
  }
}

void Toggle::togglePosition() {
  on = !on;
  const int left = _radius;
  const int right = width() - _radius;
  _anim->setStartValue(on ? left + immediateOffset : right - immediateOffset);
  _anim->setEndValue(on ? right : left);
  _anim->setDuration(animation_duration);
  _anim->start();
  repaint();
}

void Toggle::enterEvent(QEvent *e) {
  QAbstractButton::enterEvent(e);
}

bool Toggle::getEnabled() {
  return enabled;
}

void Toggle::setEnabled(bool value) {
  enabled = value;
  if (value) {
    circleColor.setRgb(0xfafafa);
    green.setRgb(0x33ab4c);
  } else {
    circleColor.setRgb(0x888888);
    green.setRgb(0x227722);
  }
}