/**
 * @file hardware_config.h
 * @brief Hardware pin configuration for Waveshare ESP32-S3-Touch-LCD-2
 * 
 * CORRECTED with proper pin assignments!
 */

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

// ============================================
// DISPLAY PINS (ST7789) - VERIFIED WORKING
// ============================================
#define LCD_SPI_HOST       SPI2_HOST
#define LCD_PIXEL_CLOCK_HZ (80 * 1000 * 1000)  // ST7789 supports up to 80MHz

#define LCD_PIN_MOSI       38
#define LCD_PIN_MISO       40
#define LCD_PIN_SCLK       39
#define LCD_PIN_CS         45
#define LCD_PIN_DC         42
#define LCD_PIN_RST        -1
#define LCD_PIN_BCKL       1

#define LCD_WIDTH          320
#define LCD_HEIGHT         240
#define LCD_ROTATION       3

#define LCD_BCKL_DEFAULT   80
#define LCD_BCKL_MIN       10
#define LCD_BCKL_MAX       100

// ============================================
// GAMEBOY DISPLAY SCALING OPTIONS
// ============================================
// Set to 1 for scaled display with black borders
// Set to 0 for full screen stretch (320x240)
#define GB_PIXEL_PERFECT_SCALING 1

// Scaling factor (float multiplier for GameBoy resolution)
// Valid range: 1.0 to 2.0
// Examples:
//   1.4 = 160x144 -> 224x202 (smaller, faster performance)
//   1.5 = 160x144 -> 240x216 (balanced)
//   1.6 = 160x144 -> 256x230 (current, excellent balance)
//   1.67 = 160x144 -> 267x240 (full height, max size)
//   2.0 = 160x144 -> 320x288 (exceeds screen height, will be clipped)
//
// Performance tip: Smaller scaling = fewer pixels = higher FPS
// Can be changed on-the-fly per game (future menu feature)
#define GB_SCALE_FACTOR 1.5

#if GB_PIXEL_PERFECT_SCALING
    // Calculate scaled dimensions dynamically from GB_SCALE_FACTOR
    // GameBoy native resolution: 160x144
    #define GB_RENDER_WIDTH  ((int)(160 * GB_SCALE_FACTOR))
    #define GB_RENDER_HEIGHT ((int)(144 * GB_SCALE_FACTOR))

    // Center the GameBoy screen with black borders
    #define GB_OFFSET_X      ((320 - GB_RENDER_WIDTH) / 2)
    #define GB_OFFSET_Y      ((240 - GB_RENDER_HEIGHT) / 2)

    // Frame buffer is full screen to hold black borders
    #define GB_SCREEN_WIDTH  320
    #define GB_SCREEN_HEIGHT 240
#else
    // Full screen: 160x144 -> 320x240 (stretch mode)
    #define GB_RENDER_WIDTH  320
    #define GB_RENDER_HEIGHT 240
    #define GB_OFFSET_X      0
    #define GB_OFFSET_Y      0

    #define GB_SCREEN_WIDTH  320
    #define GB_SCREEN_HEIGHT 240
#endif

// ============================================
// SD CARD PINS - VERIFIED WORKING
// ============================================
#define SD_SPI_HOST        LCD_SPI_HOST
#define SD_PIN_MOSI        LCD_PIN_MOSI
#define SD_PIN_MISO        LCD_PIN_MISO
#define SD_PIN_SCLK        LCD_PIN_SCLK
#define SD_PIN_CS          41

// ============================================
// TOUCH CONTROLLER PINS (CST816S)
// ============================================
#define TOUCH_I2C_NUM      I2C_NUM_0
#define TOUCH_I2C_SCL      6
#define TOUCH_I2C_SDA      5
#define TOUCH_I2C_INT      7
#define TOUCH_I2C_RST      -1
#define TOUCH_I2C_ADDR     0x15
#define TOUCH_I2C_FREQ_HZ  400000

// ============================================
// AUDIO PINS (I2S - MAX98357A)
// ============================================
#define I2S_NUM            I2S_NUM_0
#define I2S_SAMPLE_RATE    32768  // GameBoy native sample rate
#define I2S_BITS_PER_SAMPLE 16
#define I2S_PIN_BCLK       48   // Available on right header pin 6
#define I2S_PIN_LRC        47   // Available on right header pin 5
#define I2S_PIN_DIN        16   // Your original wiring (conflicts resolved by NFC move)
#define I2S_DMA_BUF_COUNT  8
#define I2S_DMA_BUF_LEN    1024

// ============================================
// GAMEBOY BUTTON PINS - REMAPPED TO FREE GPIOS!
// ============================================
#define BTN_UP             8    // D-Pad Up
#define BTN_DOWN           9    // D-Pad Down
#define BTN_LEFT           10   // D-Pad Left
#define BTN_RIGHT          11   // D-Pad Right

#define BTN_A              12   // Action Button A
#define BTN_B              13   // Action Button B
#define BTN_START          14   // Start Button
#define BTN_SELECT         21   // Select Button

#define BTN_ACTIVE_LEVEL   0    // Active LOW (buttons pull to GND)
#define BTN_DEBOUNCE_MS    50   // Debounce time

// ============================================
// POWER SWITCH (Hardware Toggle Switch)
// ============================================
#define POWER_SWITCH_PIN   0    // GPIO0 - Hardware power switch
#define POWER_SWITCH_ON    0    // Switch closed = GND = Device ON
#define POWER_SWITCH_OFF   1    // Switch open = Pull-up = Device goes to sleep

// Power switch behavior:
// - When switch is CLOSED (pin reads LOW): Device runs normally
// - When switch is OPENED (pin reads HIGH): Device enters deep-sleep
// - When switch is CLOSED again: ESP32 wakes up from deep-sleep
// 
// Implementation:
// - Configure GPIO0 with internal pull-up
// - Monitor pin state in main loop
// - On transition LOW->HIGH: Enter esp_deep_sleep_start()
// - ESP32 will wake on GPIO LOW (RTC_GPIO wakeup)

#define POWER_SWITCH_CHECK_MS  100  // Check switch state every 100ms

// ============================================
// POTENTIOMETER PINS (ADC)
// ============================================
#define POTI_VOLUME_PIN    3    // ADC1_CH2 - Volume control
#define POTI_BRIGHT_PIN    4    // ADC1_CH3 - Brightness control
#define POTI_ADC_WIDTH     ADC_WIDTH_BIT_12
#define POTI_ADC_ATTEN     ADC_ATTEN_DB_11

// ============================================
// NFC READER PINS (PN532) - Shared I2C Bus with Touch
// ============================================
#define NFC_I2C_NUM        I2C_NUM_0  // SHARED with Touch Controller!
#define NFC_I2C_SCL        TOUCH_I2C_SCL  // GPIO 6 (shared)
#define NFC_I2C_SDA        TOUCH_I2C_SDA  // GPIO 5 (shared)
#define NFC_I2C_INT        -1  // Optional interrupt
#define NFC_I2C_RST        -1  // Optional reset
#define NFC_I2C_ADDR       0x24  // Different I2C address than Touch (0x15)
#define NFC_I2C_FREQ_HZ    100000

// ============================================
// LINK CABLE PINS (GPIO for 2-Player) - Optional
// ============================================
#define LINK_GPIO_SCLK     15  // Free GPIO (NFC moved to I2C)
#define LINK_GPIO_SOUT     2   // Free GPIO on left header
#define LINK_GPIO_SIN      17  // Free GPIO
#define LINK_CLOCK_FREQ    8192
#define LINK_BYTE_TIME_US  122
#define LINK_BIT_TIME_US   15

// ============================================
// STATUS LED - Optional
// ============================================
#define LED_STATUS_PIN     18  // Changed from 19 (USB conflict!)
#define LED_ACTIVE_LEVEL   1

// ============================================
// DEBUG/UART
// ============================================
#define UART_NUM           UART_NUM_0
#define UART_TX_PIN        43
#define UART_RX_PIN        44
#define UART_BAUD_RATE     115200

// ============================================
// PIN SUMMARY (for reference)
// ============================================
/*
USED PINS - OPTIMIZED LAYOUT:
- GPIO 0:  POWER_SWITCH (Hardware toggle switch)
- GPIO 1:  LCD Backlight PWM
- GPIO 3:  Volume Potentiometer (ADC1_CH2)
- GPIO 4:  Brightness Potentiometer (ADC1_CH3)
- GPIO 5:  I2C SDA (Touch 0x15 + NFC 0x24 SHARED BUS)
- GPIO 6:  I2C SCL (Touch + NFC SHARED BUS)
- GPIO 7:  Touch Interrupt
- GPIO 8:  BTN_UP (native GPIO)
- GPIO 9:  BTN_DOWN (native GPIO)
- GPIO 10: BTN_LEFT (native GPIO)
- GPIO 11: BTN_RIGHT (native GPIO)
- GPIO 12: BTN_A (native GPIO)
- GPIO 13: BTN_B (native GPIO)
- GPIO 14: BTN_START (native GPIO)
- GPIO 2:  Link Cable SOUT
- GPIO 15: Link Cable SCLK (freed from NFC!)
- GPIO 16: I2S DIN (now conflict-free, NFC moved to shared I2C!)
- GPIO 17: Link Cable SIN
- GPIO 18: Status LED (was 19, USB conflict fixed!)
- GPIO 19: RESERVED (USB D-)
- GPIO 20: RESERVED (USB D+)
- GPIO 21: BTN_SELECT (native GPIO)
- GPIO 26-37: RESERVED (Flash/PSRAM - DO NOT USE!)
- GPIO 38: SPI MOSI (LCD + SD shared)
- GPIO 39: SPI SCLK (LCD + SD shared)
- GPIO 40: SPI MISO (LCD + SD shared)
- GPIO 41: SD Card CS
- GPIO 42: LCD DC
- GPIO 43: UART TX
- GPIO 44: UART RX
- GPIO 45: LCD CS
- GPIO 47: I2S LRC (right header pin 5)
- GPIO 48: I2S BCLK (right header pin 6)
- GPIO 16: I2S DIN (now conflict-free, NFC moved to shared I2C!)

POWER SWITCH WIRING:
┌─────────┐
│ ESP32   │
│ GPIO 0  ├──────┬──────── Switch ──────┐
│         │      │                        │
│  (Pull-up)   [Switch]                 GND
│         │      │                        
└─────────┘      │                        
                 └─ When closed: GPIO0 = LOW (ON)
                    When open:   GPIO0 = HIGH (SLEEP)
*/


