#include "stm32c0xx_hal.h"

#define LED1_PIN GPIO_PIN_1  // PA1
#define LED2_PIN GPIO_PIN_4  // PA4
#define LED3_PIN GPIO_PIN_1  // PB1
#define BUTTON_PIN GPIO_PIN_13 // PA0

// Prototypes
void SystemClock_Config(void);
void GPIO_Init(void);
void allumerLEDsGaucheADroite(void);
void eteindreLEDsDroiteAGauche(void);

int main(void)
{
    HAL_Init();  // Initialize the HAL library
    SystemClock_Config();  // Set up the clock
    GPIO_Init();  // Initialize GPIO pins

    while (1)
    {
        // Read the button state
        GPIO_PinState buttonState = HAL_GPIO_ReadPin(GPIOC, BUTTON_PIN);
        if (buttonState == GPIO_PIN_SET)
        {
            allumerLEDsGaucheADroite();
        }
        else
        {
            eteindreLEDsDroiteAGauche();
        }

        HAL_Delay(100);  // Small delay to debounce button
    }
}

void GPIO_Init(void)
{
    // Enable GPIOA and GPIOB clocks
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // Initialize LEDs as output
    GPIO_InitStruct.Pin = LED1_PIN | LED2_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = LED3_PIN;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    // Initialize the button as input
    GPIO_InitStruct.Pin = BUTTON_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;  // Use internal pull-up resistor
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void allumerLEDsGaucheADroite(void)
{
    HAL_GPIO_WritePin(GPIOA, LED1_PIN, GPIO_PIN_SET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(GPIOA, LED2_PIN, GPIO_PIN_SET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(GPIOB, LED3_PIN, GPIO_PIN_SET);
}

void eteindreLEDsDroiteAGauche(void)
{
    HAL_GPIO_WritePin(GPIOB, LED3_PIN, GPIO_PIN_RESET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(GPIOA, LED2_PIN, GPIO_PIN_RESET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(GPIOA, LED1_PIN, GPIO_PIN_RESET);
}

void SystemClock_Config(void)
{
    // Default clock configuration
}