#pragma once

#include <cstdint>

namespace esphome {
namespace climate {

/// Enum for all modes a climate device can be in.
enum ClimateMode : uint8_t {
  /// The climate device is off (not in auto, heat or cool mode)
  CLIMATE_MODE_OFF = 0,
  /// The climate device is set to automatically change the heating/cooling cycle
  CLIMATE_MODE_HEAT_COOL = 1,
  /// The climate device is manually set to cool mode (not in auto mode!)
  CLIMATE_MODE_COOL = 2,
  /// The climate device is manually set to heat mode (not in auto mode!)
  CLIMATE_MODE_HEAT = 3,
  /// The climate device is manually set to fan only mode
  CLIMATE_MODE_FAN_ONLY = 4,
  /// The climate device is manually set to dry mode
  CLIMATE_MODE_DRY = 5,
  /// The climate device is manually set to heat-cool mode
  CLIMATE_MODE_AUTO = 6
};

/// Enum for the current action of the climate device. Values match those of ClimateMode.
enum ClimateAction : uint8_t {
  /// The climate device is off (inactive or no power)
  CLIMATE_ACTION_OFF = 0,
  /// The climate device is actively cooling (usually in cool or auto mode)
  CLIMATE_ACTION_COOLING = 2,
  /// The climate device is actively heating (usually in heat or auto mode)
  CLIMATE_ACTION_HEATING = 3,
  /// The climate device is idle (monitoring climate but no action needed)
  CLIMATE_ACTION_IDLE = 4,
  /// The climate device is drying (either mode DRY or AUTO)
  CLIMATE_ACTION_DRYING = 5,
  /// The climate device is in fan only mode (either mode FAN_ONLY or AUTO)
  CLIMATE_ACTION_FAN = 6,
};

/// Enum for all modes a climate fan can be in
enum ClimateFanMode : uint8_t {
  /// The fan mode is set to On
  CLIMATE_FAN_ON = 0,
  /// The fan mode is set to Off
  CLIMATE_FAN_OFF = 1,
  /// The fan mode is set to Auto
  CLIMATE_FAN_AUTO = 2,
  /// The fan mode is set to Low
  CLIMATE_FAN_LOW = 3,
  /// The fan mode is set to Medium
  CLIMATE_FAN_MEDIUM = 4,
  /// The fan mode is set to High
  CLIMATE_FAN_HIGH = 5,
  /// The fan mode is set to Middle
  CLIMATE_FAN_MIDDLE = 6,
  /// The fan mode is set to Focus
  CLIMATE_FAN_FOCUS = 7,
  /// The fan mode is set to Diffuse
  CLIMATE_FAN_DIFFUSE = 8,
};

/// Enum for all modes a climate swing can be in
enum ClimateSwingMode : uint8_t {
  /// The swing mode is set to Off
  CLIMATE_SWING_OFF = 0,
  /// The fan mode is set to Both
  CLIMATE_SWING_BOTH = 1,
  /// The fan mode is set to Vertical
  CLIMATE_SWING_VERTICAL = 2,
  /// The fan mode is set to Horizontal
  CLIMATE_SWING_HORIZONTAL = 3,
};

/// Enum for all modes a climate swing can be in
enum ClimatePreset : uint8_t {
  /// Preset is set to ECO
  CLIMATE_PRESET_ECO = 0,
  /// Preset is set to AWAY
  CLIMATE_PRESET_AWAY = 1,
  /// Preset is set to BOOST
  CLIMATE_PRESET_BOOST = 2,
  /// Preset is set to COMFORT
  CLIMATE_PRESET_COMFORT = 3,
  /// Preset is set to HOME
  CLIMATE_PRESET_HOME = 4,
  /// Preset is set to SLEEP
  CLIMATE_PRESET_SLEEP = 5,
  /// Preset is set to ACTIVITY
  CLIMATE_PRESET_ACTIVITY = 6,
};

/// Convert the given ClimateMode to a human-readable string.
const char *climate_mode_to_string(ClimateMode mode);

/// Convert the given ClimateAction to a human-readable string.
const char *climate_action_to_string(ClimateAction action);

/// Convert the given ClimateFanMode to a human-readable string.
const char *climate_fan_mode_to_string(ClimateFanMode mode);

/// Convert the given ClimateSwingMode to a human-readable string.
const char *climate_swing_mode_to_string(ClimateSwingMode mode);

/// Convert the given ClimateSwingMode to a human-readable string.
const char *climate_preset_to_string(ClimatePreset preset);

}  // namespace climate
}  // namespace esphome
