// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.

#include "PropertyImpl.hpp"

using namespace wpi::cs;

PropertyImpl::PropertyImpl(std::string_view name_) : name{name_} {}
PropertyImpl::PropertyImpl(std::string_view name_, CS_PropertyKind kind_,
                           int step_, int defaultValue_, int value_)
    : name{name_},
      propKind{kind_},
      step{step_},
      defaultValue{defaultValue_},
      value{value_} {}
PropertyImpl::PropertyImpl(std::string_view name_, CS_PropertyKind kind_,
                           int minimum_, int maximum_, int step_,
                           int defaultValue_, int value_)
    : name{name_},
      propKind{kind_},
      hasMinimum{true},
      hasMaximum{true},
      minimum{minimum_},
      maximum{maximum_},
      step{step_},
      defaultValue{defaultValue_},
      value{value_} {}

void PropertyImpl::SetValue(int v) {
  int oldValue = value;
  if (hasMinimum && v < minimum) {
    value = minimum;
  } else if (hasMaximum && v > maximum) {
    value = maximum;
  } else {
    value = v;
  }
  bool wasValueSet = valueSet;
  valueSet = true;
  if (!wasValueSet || value != oldValue) {
    changed();
  }
}

void PropertyImpl::SetValue(std::string_view v) {
  bool valueChanged = false;
  if (valueStr != v) {
    valueStr = v;
    valueChanged = true;
  }
  bool wasValueSet = valueSet;
  valueSet = true;
  if (!wasValueSet || valueChanged) {
    changed();
  }
}

void PropertyImpl::SetDefaultValue(int v) {
  if (hasMinimum && v < minimum) {
    defaultValue = minimum;
  } else if (hasMaximum && v > maximum) {
    defaultValue = maximum;
  } else {
    defaultValue = v;
  }
}
