# ==========================================
# CYD ESP32-2432S028 mit XPT2046 Touch v.12
# ==========================================
esphome:
  name: cyd3

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:
api:
ota:
  - platform: esphome

wifi:
  ssid: "your SSID"
  password: "your password"

# Webserver (Zugriff über IP im Browser)
web_server:
  port: 80

# 1. Schriftarten (Sehr groß & Fett via Google Font URL)
font:
  - file: "gfonts://Roboto@700"
    id: font_huge
    size: 110
  - file: "gfonts://Roboto"
    id: font_info
    size: 20

# 2. Farben
color:
  - id: my_white
    red: 100%
    green: 100%
    blue: 100%
  - id: my_gray
    red: 50%
    green: 50%
    blue: 50%
  - id: my_green
    red: 0%
    green: 100%
    blue: 0%
  - id: my_cyan
    red: 0%
    green: 100%
    blue: 100%
  - id: my_red
    red: 100%
    green: 20%
    blue: 20%
  - id: my_blue
    red: 20%
    green: 50%
    blue: 100%

# 3. NTP Uhrzeit
time:
  - platform: sntp
    id: sntp_time
    timezone: "Europe/Berlin"

# 4. Sensoren & Reboot Switch
text_sensor:
  - platform: wifi_info
    ip_address:
      id: wifi_ip_address

sensor:
  - platform: wifi_signal
    name: "WLAN Signal"
    id: wifi_signal_db
    update_interval: 10s

  - platform: internal_temperature
    name: "CPU Temp"
    id: cpu_temp
    update_interval: 10s

button:
  - platform: restart
    id: restart_button
    name: "CYD Reboot"

# 5. SPI-Busse (SPI1 für Display, SPI2 speziell für XPT2046 Touch)
spi:
  - clk_pin: GPIO14
    mosi_pin: GPIO13
    miso_pin: GPIO12
    id: lcd_spi

  - clk_pin: GPIO25
    mosi_pin: GPIO32
    miso_pin: GPIO39
    id: touch_spi

# 6. Touchscreen XPT2046 mit korrigierter Sleep-Steuerung
touchscreen:
  platform: xpt2046
  id: my_touch
  spi_id: touch_spi
  cs_pin: GPIO33
  interrupt_pin: GPIO36
  threshold: 400
  calibration:
    x_min: 300
    x_max: 3800
    y_min: 300
    y_max: 3800
  transform:
    swap_xy: true
    mirror_x: true
    mirror_y: true
  on_touch:
    - lambda: |-
        ESP_LOGI("touch", "Geklickt bei X: %d, Y: %d", touch.x, touch.y);

        // Aufwachen, wenn Display aus war
        if (!id(display_backlight).current_values.is_on()) {
          auto call = id(display_backlight).turn_on();
          call.perform();
          return;
        }

        // --- SCREEN 1 ---
        if (id(my_display).get_active_page() == id(page1)) {
          id(my_display).show_page(id(page2));
          id(my_display).set_timeout("auto_back", 120000, []() {
            id(my_display).show_page(id(page1));
          });
          return;
        }

        // --- SCREEN 2 ---
        if (id(my_display).get_active_page() == id(page2)) {
          // Touch-Bereich für Buttons unten (Y > 150)
          if (touch.y > 150) {
            // Button 1: REBOOT (X < 106)
            if (touch.x < 106) {
              ESP_LOGI("touch", "REBOOT geklickt!");
              id(restart_button).press();
              return;
            }
            // Button 2: SLEEP (107 <= X < 213)
            else if (touch.x >= 107 && touch.x < 213) {
              ESP_LOGI("touch", "SLEEP geklickt!");
              auto call = id(display_backlight).turn_off();
              call.perform();
              return;
            }
            // Button 3: BACK (X >= 214)
            else if (touch.x >= 214) {
              ESP_LOGI("touch", "BACK geklickt!");
              id(my_display).cancel_timeout("auto_back");
              id(my_display).show_page(id(page1));
              return;
            }
          }
        }

# 7. Backlight
output:
  - platform: gpio
    pin: GPIO21
    id: back_light

light:
  - platform: binary
    output: back_light
    name: "CYD Backlight"
    id: display_backlight
    restore_mode: ALWAYS_ON

# 8. Display & Pages
display:
  - platform: mipi_spi
    id: my_display
    model: ILI9341
    spi_id: lcd_spi
    cs_pin: GPIO15
    dc_pin: GPIO2
    reset_pin: GPIO4
    data_rate: 20MHz
    dimensions:
      width: 320
      height: 240
    pages:
      # SCREEN 1: Wochentag/Datum oben + zentrierte XXL-Uhr + Sekundenbalken
      - id: page1
        lambda: |-
          it.fill(Color::BLACK);

          if (id(sntp_time).now().is_valid()) {
            // Datum & Wochentag oben
            auto t = id(sntp_time).now();
            const char *wd_names[] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
            std::string date_str = std::string(wd_names[t.day_of_week - 1]) + t.strftime(", %d.%m.%Y");
            it.print(160, 15, id(font_info), id(my_white), TextAlign::TOP_CENTER, date_str.c_str());

            // Große Uhr mittig
            it.strftime(160, 120, id(font_huge), id(my_white), TextAlign::CENTER, "%H:%M", id(sntp_time).now());
            
            // Sekundenbalken unten
            int sec = id(sntp_time).now().second;
            int bar_width = (sec * 320) / 60;
            it.filled_rectangle(0, 232, bar_width, 8, id(my_white));
          } else {
            it.print(160, 15, id(font_info), id(my_white), TextAlign::TOP_CENTER, "Datum wird geladen...");
            it.print(160, 120, id(font_huge), id(my_white), TextAlign::CENTER, "--:--");
          }

      # SCREEN 2: Statischer Titel & System-Infos & 3 Buttons
      - id: page2
        lambda: |-
          it.fill(Color::BLACK);

          // Statische Kopfzeile
          it.print(160, 15, id(font_info), id(my_white), TextAlign::TOP_CENTER, "CYD ESP32-2432S028 Test v12");

          // System-Infos
          it.printf(160, 55, id(font_info), id(my_green), TextAlign::TOP_CENTER, "IP: %s", id(wifi_ip_address).state.c_str());

          int signal_percent = 0;
          if (id(wifi_signal_db).has_state()) {
            signal_percent = min(max(2 * (int(id(wifi_signal_db).state) + 100), 0), 100);
          }
          if (id(cpu_temp).has_state()) {
            it.printf(160, 95, id(font_info), id(my_cyan), TextAlign::TOP_CENTER, "WLAN: %d%%  |  CPU: %.1f °C", signal_percent, id(cpu_temp).state);
          } else {
            it.printf(160, 95, id(font_info), id(my_cyan), TextAlign::TOP_CENTER, "WLAN: %d%%  |  CPU: -- °C", signal_percent);
          }

          // 1. Button: Reboot (Rot)
          it.filled_rectangle(10, 170, 90, 45, id(my_red));
          it.print(55, 182, id(font_info), id(my_white), TextAlign::TOP_CENTER, "Reboot");

          // 2. Button: Sleep (Blau)
          it.filled_rectangle(115, 170, 90, 45, id(my_blue));
          it.print(160, 182, id(font_info), id(my_white), TextAlign::TOP_CENTER, "Sleep");

          // 3. Button: Back (Grau)
          it.filled_rectangle(220, 170, 90, 45, id(my_gray));
          it.print(265, 182, id(font_info), id(my_white), TextAlign::TOP_CENTER, "Back");