/**
 * @file config.h
 *
 * @brief Header file for configuration settings and EEPROM operations in the ChainLube application.
 *
 * This file defines configuration settings for the ChainLube project, including default values,
 * EEPROM structures, and functions for EEPROM operations. It also defines enums for different sources
 * of speed input, GPS baud rates, and CAN bus sources. Additionally, it includes functions for EEPROM handling
 * such as storing, retrieving, and formatting configuration data.
 *
 * @author Marcel Peterkau
 * @date   09.01.2024
 */

#ifndef _CONFIG_H_
#define _CONFIG_H_

#include <Arduino.h>
#include <Wire.h>
#include <I2C_eeprom.h>
#include "dtc.h"
#include "common.h"

#if PCB_REV == 1 || PCB_REV == 2 || PCB_REV == 3
#define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC64
#elif PCB_REV == 4
#define EEPROM_SIZE_BYTES I2C_DEVICESIZE_24LC256
#endif

typedef enum EERequest_e
{
  EE_IDLE,
  EE_CFG_SAVE,
  EE_CFG_LOAD,
  EE_CFG_FORMAT,
  EE_PDS_SAVE,
  EE_PDS_LOAD,
  EE_PDS_FORMAT,
  EE_FORMAT_ALL,
  EE_ALL_SAVE

} EERequest_t;

// Structure for persistence data stored in EEPROM
typedef struct
{
  uint16_t writeCycleCounter;
  uint32_t tankRemain_microL;
  uint32_t TravelDistance_highRes_mm;
  uint32_t odometer_mm;
  uint32_t odometer;
  uint32_t checksum;
} persistenceData_t;

// Structure for configuration settings stored in EEPROM
typedef struct
{
  uint8_t EEPROM_Version;
  uint32_t DistancePerLube_Default;
  uint32_t DistancePerLube_Rain;
  uint32_t tankCapacity_ml;
  uint32_t amountPerDose_microL;
  uint8_t TankRemindAtPercentage;
  uint8_t PulsePerRevolution;
  uint32_t TireWidth_mm;
  uint32_t TireWidthHeight_Ratio;
  uint32_t RimDiameter_Inch;
  uint32_t DistancePerRevolution_mm;
  uint16_t BleedingPulses;
  SpeedSource_t SpeedSource;
  GPSBaudRate_t GPSBaudRate;
  CANSource_t CANSource;
  bool LED_Mode_Flash;
  uint8_t LED_Max_Brightness;
  uint8_t LED_Min_Brightness;
  uint32_t checksum;
} LubeConfig_t;

// Default configuration settings
const LubeConfig_t LubeConfig_defaults = {
    0, 8000, 4000, 320, DEFAULT_PUMP_DOSE, 30, 1, 150, 70, 18, 2000, 25, SOURCE_IMPULSE,
    BAUD_115200,
    KTM_890_ADV_R_2021,
    false,
    255,
    5,
    0};

void InitEEPROM();
void EEPROM_Process();
void StoreConfig_EEPROM();
void GetConfig_EEPROM();
void StorePersistence_EEPROM();
void GetPersistence_EEPROM();
void FormatConfig_EEPROM();
void FormatPersistence_EEPROM();
uint32_t Checksum_EEPROM(uint8_t const *data, size_t len);
void dumpEEPROM(uint16_t memoryAddress, uint16_t length);
void MovePersistencePage_EEPROM(boolean reset);
uint32_t ConfigSanityCheck(bool autocorrect = false);

extern LubeConfig_t LubeConfig;
extern persistenceData_t PersistenceData;
extern uint16_t eePersistenceMarker;
#endif // _CONFIG_H_