//
// Created by laura on 24.04.23.
//

#include "OperatingModes.h"
#include "SolderingCommon.h"

extern bool heaterThermalRunaway;

void detailedPowerStatus() {
  if (OLED::getRotation()) {
    OLED::setCursor(0, 0);
  } else {
    OLED::setCursor(67, 0);
  }
  // Print wattage
  {
    uint32_t x10Watt = x10WattHistory.average();
    if (x10Watt > 999) { // If we exceed 99.9W we drop the decimal place to keep it all fitting
      OLED::print(SmallSymbolSpace, FontStyle::SMALL);
      OLED::printNumber(x10WattHistory.average() / 10, 3, FontStyle::SMALL);
    } else {
      OLED::printNumber(x10WattHistory.average() / 10, 2, FontStyle::SMALL);
      OLED::print(SmallSymbolDot, FontStyle::SMALL);
      OLED::printNumber(x10WattHistory.average() % 10, 1, FontStyle::SMALL);
    }
    OLED::print(SmallSymbolWatts, FontStyle::SMALL);
  }

  if (OLED::getRotation()) {
    OLED::setCursor(0, 8);
  } else {
    OLED::setCursor(67, 8);
  }
  printVoltage();
  OLED::print(SmallSymbolVolts, FontStyle::SMALL);
}

void basicSolderingStatus(bool boostModeOn) {
  OLED::setCursor(0, 0);
  // We switch the layout direction depending on the orientation of the oled
  if (OLED::getRotation()) {
    // battery
    gui_drawBatteryIcon();
    OLED::print(LargeSymbolSpace, FontStyle::LARGE); // Space out gap between battery <-> temp
    gui_drawTipTemp(true, FontStyle::LARGE);         // Draw current tip temp

    // We draw boost arrow if boosting, or else gap temp <-> heat
    // indicator
    if (boostModeOn)
      OLED::drawSymbol(2);
    else
      OLED::print(LargeSymbolSpace, FontStyle::LARGE);

    // Draw heating/cooling symbols
    OLED::drawHeatSymbol(X10WattsToPWM(x10WattHistory.average()));
  } else {
    // Draw heating/cooling symbols
    OLED::drawHeatSymbol(X10WattsToPWM(x10WattHistory.average()));
    // We draw boost arrow if boosting, or else gap temp <-> heat
    // indicator
    if (boostModeOn)
      OLED::drawSymbol(2);
    else
      OLED::print(LargeSymbolSpace, FontStyle::LARGE);
    gui_drawTipTemp(true, FontStyle::LARGE); // Draw current tip temp

    OLED::print(LargeSymbolSpace, FontStyle::LARGE); // Space out gap between battery <-> temp

    gui_drawBatteryIcon();
  }
}

bool checkExitSoldering(void) {
#ifdef POW_DC
  // Undervoltage test
  if (checkForUnderVoltage()) {
    lastButtonTime = xTaskGetTickCount();
    return true;
  }
#endif

#ifdef ACCEL_EXITS_ON_MOVEMENT
  // If the accel works in reverse where movement will cause exiting the soldering mode
  if (getSettingValue(Sensitivity)) {
    if (lastMovementTime) {
      if (lastMovementTime > TICKS_SECOND * 10) {
        // If we have moved recently; in the last second
        // Then exit soldering mode

        if (((TickType_t)(xTaskGetTickCount() - lastMovementTime)) < (TickType_t)(TICKS_SECOND)) {
          currentTempTargetDegC = 0;
          return true;
        }
      }
    }
  }
#endif
#ifdef NO_SLEEP_MODE
  // No sleep mode, but still want shutdown timeout

  if (shouldShutdown()) {
    // shutdown
    currentTempTargetDegC = 0;
    return true; // we want to exit soldering mode
  }
#endif
  if (shouldBeSleeping(false)) {
    if (gui_SolderingSleepingMode(false, false)) {
      return true; // If the function returns non-0 then exit
    }
  }

  // If we have tripped thermal runaway, turn off heater and show warning
  if (heaterThermalRunaway) {
    currentTempTargetDegC = 0; // heater control off
    warnUser(translatedString(Tr->WarningThermalRunaway), 10 * TICKS_SECOND);
    heaterThermalRunaway = false;
    return true;
  }

  return false;
}