#include "y2022_bot3/constants.h"

#include <cinttypes>
#include <map>

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

#include "absl/base/call_once.h"
#include "aos/mutex/mutex.h"
#include "aos/network/team_number.h"
#include "glog/logging.h"
#include "y2022_bot3/control_loops/superstructure/climber/integral_climber_plant.h"
#include "y2022_bot3/control_loops/superstructure/intake/integral_intake_plant.h"

namespace y2022_bot3 {
namespace constants {

const int Values::kZeroingSampleSize;

namespace {

const uint16_t kCompTeamNumber = 971;
const uint16_t kPracticeTeamNumber = 9971;
const uint16_t kCodingRobotTeamNumber = 7971;

}  // namespace

Values MakeValues(uint16_t team) {
  LOG(INFO) << "creating a Constants for team: " << team;

  Values r;

  auto *const intake = &r.intake;
  auto *const climber_left = &r.climber_left;
  auto *const climber_right = &r.climber_right;

  ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
      ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator>
      intake_params;

  intake_params.zeroing_voltage = 3.0;
  intake_params.operating_voltage = 12.0;
  intake_params.zeroing_profile_params = {0.5, 3.0};
  intake_params.default_profile_params = {6.0, 30.0};
  intake_params.range = Values::kIntakeRange();
  intake_params.make_integral_loop =
      control_loops::superstructure::intake::MakeIntegralIntakeLoop;
  intake_params.zeroing_constants.average_filter_size =
      Values::kZeroingSampleSize;
  intake_params.zeroing_constants.one_revolution_distance =
      M_PI * 2.0 * constants::Values::kIntakeEncoderRatio();
  intake_params.zeroing_constants.zeroing_threshold = 0.0005;
  intake_params.zeroing_constants.moving_buffer_size = 20;
  intake_params.zeroing_constants.allowable_encoder_error = 0.9;
  intake_params.zeroing_constants.measured_absolute_position = 0.0;

  intake->subsystem_params = intake_params;

  ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
      ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator>
      climber_params;

  climber_params.zeroing_voltage = 3.0;
  climber_params.operating_voltage = 12.0;
  climber_params.zeroing_profile_params = {0.5, 0.1};
  climber_params.default_profile_params = {5.0, 1.0};
  climber_params.range = Values::kClimberRange();
  climber_params.make_integral_loop =
      control_loops::superstructure::climber::MakeIntegralClimberLoop;
  climber_params.zeroing_constants.average_filter_size =
      Values::kZeroingSampleSize;
  climber_params.zeroing_constants.one_revolution_distance =
      constants::Values::kClimberEncoderRatio() *
      constants::Values::kClimberEncoderMetersPerRevolution();
  climber_params.zeroing_constants.zeroing_threshold = 0.0005;
  climber_params.zeroing_constants.moving_buffer_size = 20;
  climber_params.zeroing_constants.allowable_encoder_error = 0.9;
  climber_params.zeroing_constants.measured_absolute_position = 0.0;

  climber_left->subsystem_params = climber_params;
  climber_right->subsystem_params = climber_params;

  switch (team) {
    // A set of constants for tests.
    case 1:
      intake->potentiometer_offset = 0.0;
      intake->subsystem_params.zeroing_constants.measured_absolute_position =
          0.0;
      climber_left->potentiometer_offset = 0.0;
      climber_left->subsystem_params.zeroing_constants
          .measured_absolute_position = 0.0;
      climber_right->potentiometer_offset = 0.0;
      climber_right->subsystem_params.zeroing_constants
          .measured_absolute_position = 0.0;
      break;

    case kCompTeamNumber:
      intake->potentiometer_offset = 0.0;
      intake->subsystem_params.zeroing_constants.measured_absolute_position =
          0.0;
      climber_left->potentiometer_offset = 0.0;
      climber_left->subsystem_params.zeroing_constants
          .measured_absolute_position = 0.0;
      climber_right->potentiometer_offset = 0.0;
      climber_right->subsystem_params.zeroing_constants
          .measured_absolute_position = 0.0;
      break;

    case kPracticeTeamNumber:
      intake->potentiometer_offset = 0.0;
      intake->subsystem_params.zeroing_constants.measured_absolute_position =
          0.0;
      climber_left->potentiometer_offset = 0.0;
      climber_left->subsystem_params.zeroing_constants
          .measured_absolute_position = 0.0;
      climber_right->potentiometer_offset = 0.0;
      climber_right->subsystem_params.zeroing_constants
          .measured_absolute_position = 0.0;
      break;

    case kCodingRobotTeamNumber:
      intake->potentiometer_offset = 0.0;
      intake->subsystem_params.zeroing_constants.measured_absolute_position =
          0.0;
      climber_left->potentiometer_offset = 0.0;
      climber_left->subsystem_params.zeroing_constants
          .measured_absolute_position = 0.0;
      climber_right->potentiometer_offset = 0.0;
      climber_right->subsystem_params.zeroing_constants
          .measured_absolute_position = 0.0;
      break;

    default:
      LOG(FATAL) << "unknown team: " << team;
  }

  return r;
}

Values MakeValues() { return MakeValues(aos::network::GetTeamNumber()); }

}  // namespace constants
}  // namespace y2022_bot3
