#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "u8g2.h"

// Definições dos pinos
#define SDA_PIN 4
#define SCL_PIN 5
#define BUTTON_A_PIN 14
#define BUTTON_B_PIN 15
#define ENERGY_ELECTRIC_PIN 16
#define ENERGY_SOLAR_PIN 17

// Variáveis globais
bool auto_mode = false;
bool current_source = true; // true = elétrica, false = solar
u8g2_t u8g2;

// Função para inicializar a tela OLED
void init_oled() {
    u8g2_Setup_ssd1306_i2c_128x64_noname_f(
        &u8g2,
        U8G2_R0,
        u8x8_byte_sw_i2c,
        u8x8_gpio_and_delay_pico
    );
    u8g2_SetI2CAddress(&u8g2, 0x3C);
    u8g2_InitDisplay(&u8g2);
    u8g2_SetPowerSave(&u8g2, 0);
}

// Função para exibir informações na OLED
void display_status(const char* mode, const char* source) {
    u8g2_ClearBuffer(&u8g2);
    u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);
    u8g2_DrawStr(&u8g2, 0, 10, "Modo:");
    u8g2_DrawStr(&u8g2, 50, 10, mode);
    u8g2_DrawStr(&u8g2, 0, 30, "Fonte:");
    u8g2_DrawStr(&u8g2, 50, 30, source);
    u8g2_SendBuffer(&u8g2);
}

// Função principal
int main() {
    stdio_init_all();

    // Inicializar GPIOs
    gpio_init(BUTTON_A_PIN);
    gpio_set_dir(BUTTON_A_PIN, GPIO_IN);
    gpio_pull_down(BUTTON_A_PIN);

    gpio_init(BUTTON_B_PIN);
    gpio_set_dir(BUTTON_B_PIN, GPIO_IN);
    gpio_pull_down(BUTTON_B_PIN);

    gpio_init(ENERGY_ELECTRIC_PIN);
    gpio_set_dir(ENERGY_ELECTRIC_PIN, GPIO_IN);

    gpio_init(ENERGY_SOLAR_PIN);
    gpio_set_dir(ENERGY_SOLAR_PIN, GPIO_IN);

    // Inicializar I2C
    i2c_init(i2c0, 100 * 1000);
    gpio_set_function(SDA_PIN, GPIO_FUNC_I2C);
    gpio_set_function(SCL_PIN, GPIO_FUNC_I2C);
    gpio_pull_up(SDA_PIN);
    gpio_pull_up(SCL_PIN);

    // Inicializar OLED
    init_oled();

    while (1) {
        // Leitura dos botões
        bool button_a_pressed = gpio_get(BUTTON_A_PIN);
        bool button_b_pressed = gpio_get(BUTTON_B_PIN);

        if (button_a_pressed) {
            auto_mode = false;
            current_source = !current_source;
        }

        if (button_b_pressed) {
            auto_mode = !auto_mode;
        }

        if (auto_mode) {
            bool electric_status = gpio_get(ENERGY_ELECTRIC_PIN);
            bool solar_status = gpio_get(ENERGY_SOLAR_PIN);

            if (!electric_status) {
                current_source = false;
            } else if (!solar_status) {
                current_source = true;
            }
        }

        // Exibição na tela
        const char* mode = auto_mode ? "Automatico" : "Manual";
        const char* source = current_source ? "Eletrica" : "Solar";
        display_status(mode, source);

        sleep_ms(500);
    }

    return 0;
}