#include "y2014/constants.h"

#include <cinttypes>
#include <cmath>
#include <cstdint>
#include <map>

#if __has_feature(address_sanitizer)
#include "sanitizer/lsan_interface.h"
#endif

#include "absl/base/call_once.h"
#include "absl/log/check.h"
#include "absl/log/log.h"

#include "aos/network/team_number.h"
#include "aos/stl_mutex/stl_mutex.h"
#include "y2014/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
#include "y2014/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h"

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

namespace y2014::constants {
namespace {

const uint16_t kCompTeamNumber = 971;
const uint16_t kPracticeTeamNumber = 9971;
const uint16_t kRoboRioTeamNumber = 254;

const double kCompDrivetrainEncoderRatio =
    (18.0 / 50.0) /*output reduction*/ * (56.0 / 30.0) /*encoder gears*/;
const double kCompLowGearRatio = 18.0 / 60.0 * 18.0 / 50.0;
const double kCompHighGearRatio = 28.0 / 50.0 * 18.0 / 50.0;

const double kPracticeDrivetrainEncoderRatio = kCompDrivetrainEncoderRatio;
const double kPracticeLowGearRatio = kCompLowGearRatio;
const double kPracticeHighGearRatio = kCompHighGearRatio;

const DualHallShifterHallEffect kCompLeftDriveShifter{
    {2.33, 4.25, 0.2, 0.7}, 2.61, 3.28};
const DualHallShifterHallEffect kCompRightDriveShifter{
    {4.31, 4.32, 0.2, 0.7}, 2.94, 3.25};

const DualHallShifterHallEffect kPracticeLeftDriveShifter{
    {3.05, 4.15, 0.2, 0.7}, 2.80, 3.2};
const DualHallShifterHallEffect kPracticeRightDriveShifter{
    {3.75, 3.80, 0.2, 0.7}, 2.90, 2.98};

const double shooter_zeroing_speed = 0.05;
const double shooter_unload_speed = 0.08;

// Smaller (more negative) = opening.
const double kCompTopClawOffset = -0.120;

const Values *DoGetValuesForTeam(uint16_t team) {
  switch (team) {
    case 1:  // for tests
      return new Values{
          kCompDrivetrainEncoderRatio,
          kCompLowGearRatio,
          kCompHighGearRatio,
          kCompLeftDriveShifter,
          kCompRightDriveShifter,
          false,
          ::y2014::control_loops::drivetrain::MakeVelocityDrivetrainLoop,
          ::y2014::control_loops::drivetrain::MakeDrivetrainLoop,
          5.0,  // drivetrain max speed

          // ShooterLimits
          {-0.00127,
           0.298196,
           -0.0017,
           0.305054,
           0.0149098,
           {-0.001778, 0.000762, 0, 0},
           {-0.001778, 0.008906, 0, 0},
           {0.006096, 0.026416, 0, 0},
           shooter_zeroing_speed,
           shooter_unload_speed},
          {
              0.5,
              0.1,
              0.1,
              0.0,
              1.57,
              0.05,
              1.5,
              {0.0,
               2.05,
               0.02,
               2.02,
               {-0.1, 0.05, -0.1, 0.05},
               {1.0, 1.1, 1.0, 1.1},
               {2.0, 2.1, 2.0, 2.1}},
              {0.0,
               2.05,
               0.02,
               2.02,
               {-0.1, 0.05, -0.1, 0.05},
               {1.0, 1.1, 1.0, 1.1},
               {2.0, 2.1, 2.0, 2.1}},
              0.01,  // claw_unimportant_epsilon
              0.9,   // start_fine_tune_pos
              4.0,
          },
          {0.07, 0.15},  // shooter_action
      };
      break;
    case kCompTeamNumber:
      return new Values{
          kCompDrivetrainEncoderRatio,
          kCompLowGearRatio,
          kCompHighGearRatio,
          kCompLeftDriveShifter,
          kCompRightDriveShifter,
          false,
          ::y2014::control_loops::drivetrain::MakeVelocityDrivetrainLoop,
          ::y2014::control_loops::drivetrain::MakeDrivetrainLoop,
          5.0,  // drivetrain max speed

          // ShooterLimits
          {-0.001041,
           0.296019,
           -0.001488,
           0.302717,
           0.0149098,
           {-0.002, 0.000446, -0.002, 0.000446},
           {-0.002, 0.009078, -0.002, 0.009078},
           {0.003870, 0.026194, 0.003869, 0.026343},
           shooter_zeroing_speed,
           shooter_unload_speed},
          {
              0.800000,
              0.400000,
              0.000000,
              -1.220821,
              1.822142,
              -0.849484,
              1.42309,
              // 0.0371
              {-3.3284,
               2.0917,
               -3.1661,
               1.95,
               {-3.4, -3.02 + kCompTopClawOffset, -3.4,
                -2.9876 + kCompTopClawOffset},
               {-0.1433 + kCompTopClawOffset, 0.0670 + kCompTopClawOffset,
                -0.1460 + kCompTopClawOffset, 0.0648 + kCompTopClawOffset},
               {1.9952 + kCompTopClawOffset, 2.2, 1.9898 + kCompTopClawOffset,
                2.2}},
              {-2.453460,
               3.082960,
               -2.453460,
               3.082960,
               {-2.6, -2.185752, -2.6, -2.184843},
               {-0.322249, -0.053177, -0.332248, -0.059086},
               {2.892065, 3.2, 2.888429, 3.2}},
              0.040000,   // claw_unimportant_epsilon
              -0.400000,  // start_fine_tune_pos
              4.000000,
          },
          // TODO(james): Get realer numbers for shooter_action.
          {0.07, 0.15},  // shooter_action
      };
      break;
    case kPracticeTeamNumber:
    case kRoboRioTeamNumber:
      return new Values{
          kPracticeDrivetrainEncoderRatio,
          kPracticeLowGearRatio,
          kPracticeHighGearRatio,
          kPracticeLeftDriveShifter,
          kPracticeRightDriveShifter,
          false,
          ::y2014::control_loops::drivetrain::MakeVelocityDrivetrainLoop,
          ::y2014::control_loops::drivetrain::MakeDrivetrainLoop,
          5.0,  // drivetrain max speed

          // ShooterLimits
          {-0.001042,
           0.294084,
           -0.001935,
           0.303460,
           0.0138401,
           {-0.002, 0.000446, -0.002, 0.000446},
           {-0.002 + 0.001, 0.009078 + 0.001, -0.002 + 0.001, 0.009078 + 0.001},
           {0.003869 + 0.001, 0.026194 + 0.001, 0.003869 + 0.001,
            0.026194 + 0.001},
           shooter_zeroing_speed,
           shooter_unload_speed},
          {
              0.400000 * 2.0,
              0.200000 * 2.0,
              0.000000 * 2.0,
              -0.762218 * 2.0,
              1.767146,
              -0.849484,
              1.42308,
              {-3.364758,
               2.086668,
               -3.166136,
               1.95,
               {-1.7 * 2.0, -1.544662 * 2.0 + 0.139081, -1.7 * 2.0,
                -1.547616 * 2.0 + 0.139081 + 0.013636},
               {-0.115446 * 2.0, 0.030452 * 2.0, -0.120900 * 2.0,
                0.023862 * 2.0},
               {0.977884 * 2.0, 1.4 * 2.0, 0.963113 * 2.0, 1.4 * 2.0}},
              {-2.451642,
               3.107504,
               -2.273474,
               2.750,
               {-1.5 * 2.0, -1.027199 * 2.0, -1.5 * 2.0, -1.037880 * 2.0},
               {-0.116355 * 2.0, 0.017726 * 2.0, -0.125673 * 2.0,
                0.008636 * 2.0},
               {2.894792 + 0.122719, 3.2, 2.887974 + 0.122719 - 0.029088, 3.2}},
              0.040000,   // claw_unimportant_epsilon
              -0.400000,  // start_fine_tune_pos
              4.000000,
          },
          // TODO(james): Get realer numbers for shooter_action.
          {0.07, 0.15},  // shooter_action
      };
      break;
    default:
      LOG(FATAL) << "unknown team: " << team;
  }
}

void DoGetValues(const Values **result) {
  uint16_t team = ::aos::network::GetTeamNumber();
  LOG(INFO) << "creating a Constants for team: " << team;
  *result = DoGetValuesForTeam(team);
  return;
}

}  // namespace

const Values &GetValues() {
  static absl::once_flag once;
  static const Values *result;
  absl::call_once(once, DoGetValues, &result);
  return *result;
}

const Values &GetValuesForTeam(uint16_t team_number) {
  static aos::stl_mutex mutex;
  std::unique_lock<aos::stl_mutex> locker(mutex);

  // IMPORTANT: This declaration has to stay after the mutex is locked to avoid
  // race conditions.
  static ::std::map<uint16_t, const Values *> values;

  if (values.count(team_number) == 0) {
    values[team_number] = DoGetValuesForTeam(team_number);
#if __has_feature(address_sanitizer)
    __lsan_ignore_object(values[team_number]);
#endif
  }
  return *values[team_number];
}

}  // namespace y2014::constants
