#ifndef I2C_H_
#define I2C_H_

#include <stdint.h>
#include <stdbool.h>
#include "esp_err.h"

#define I2C_PORT I2C_NUM_0
#define TCA_ADDR_READ  0x21
#define TCA_ADDR_WRITE 0x21
#define I2C_PULLUP GPIO_PULLUP_DISABLE
#define I2C_FREQUENCY 400000

// TCA9555 Registers
#define TCA_REG_INPUT0    0x00
#define TCA_REG_INPUT1    0x01
#define TCA_REG_OUTPUT0   0x02
#define TCA_REG_OUTPUT1   0x03
#define TCA_REG_POLARITY0 0x04
#define TCA_REG_POLARITY1 0x05
#define TCA_REG_CONFIG0   0x06
#define TCA_REG_CONFIG1   0x07

// Debounce & Repeat Settings
#define DEBOUNCE_MS        50
#define REPEAT_MS         200
#define REPEAT_START_MS   700

typedef union {
    uint8_t raw;
    struct {
        uint8_t SENSORS  : 1;  // [0]
        uint8_t C3 : 1;  // [1]
        uint8_t B3 : 1;  // [2]
        uint8_t A3 : 1;  // [3]
        uint8_t B2 : 1;  // [4]
        uint8_t A2 : 1;  // [5]
        uint8_t B1 : 1;  // [6]
        uint8_t A1 : 1;  // [7] MSB
    } bits;
    struct {
		uint8_t SENSORS : 1;
        uint8_t C3      : 1;
        uint8_t AUX     : 2; 
        uint8_t  JACK   : 2;
        uint8_t  DRIVE  : 2;
	} bridges;
} relay_port_t;

// Public Functions
esp_err_t i2c_init(void);
esp_err_t i2c_stop(void);

esp_err_t i2c_set_relays(relay_port_t states);
esp_err_t i2c_set_led1(uint8_t state);

esp_err_t i2c_poll_buttons();

bool i2c_get_button_tripped(uint8_t button);
bool i2c_get_button_released(uint8_t button);
bool i2c_get_button_state(uint8_t button);
bool i2c_get_button_repeat(uint8_t btn);
int8_t i2c_get_button_repeats(uint8_t btn);
int64_t i2c_get_button_us(uint8_t btn);
int64_t i2c_get_button_ms(uint8_t btn);

#endif // I2C_H_