/**
 * TODO file description
 */
//
// Created by MightyPork on 2023/04/09.
//

#include <stdio.h>
#include <string.h>
#include "app_gui.h"
#include "gui_event.h"
#include "ds_rtc.h"
#include "app_io.h"
#include "app_config.h"

static int page = 1;

#define PAGECOUNT 3

struct AppConfig settings_scratch;

/** Clear the top 3 lines in the LCD - this fixes some problems with utf8 allocations
 * (char still held by a line later overwritten) */
static void clear_menu_lines();

void screen_settings(GuiEvent event)
{
    switch (event) {
        case GUI_EVENT_SCREEN_INIT:
            page = 1;
            memcpy(&settings_scratch, &app_config, APPCONFIG_SIZE);
            break;

        case GUI_EVENT_PAINT:
            switch (page) {
                case 1:
                    snprintf(sbuf, sbuf_len, "1. Program=%s", settings_scratch.scheduler_enable ? "ZAP" : "VYP");
                    LcdBuffer_Write(&lcd, 0, 0, sbuf);
                    LcdBuffer_Write(&lcd, 1, 0, "2. Upravit program");
                    LcdBuffer_Write(&lcd, 2, 0, "3. Nastavit čas");
                    break;

                case 2:
                    LcdBuffer_Write(&lcd, 0, 0, "1. Délka zálivky");
                    LcdBuffer_Write(&lcd, 1, 0, "2. Kompenzace tlaku");
                    snprintf(sbuf, sbuf_len, "3. Suché dny (%d)", settings_scratch.scheduler_dry_days);
                    LcdBuffer_Write(&lcd, 2, 0, sbuf);
                    break;

                case 3:
                    snprintf(sbuf, sbuf_len, "1. Blok.vlhkostí=%s", settings_scratch.moisture_enable ? "ZAP" : "VYP");
                    LcdBuffer_Write(&lcd, 0, 0, sbuf);
                    LcdBuffer_Write(&lcd, 1, 0, "2. Kalibrace vlhkom.");
                    snprintf(sbuf, sbuf_len, "3. Práh vlh.=%d%%", settings_scratch.moisture_threshold_percent);
                    LcdBuffer_Write(&lcd, 2, 0, sbuf);
                    break;
            }

            snprintf(sbuf, sbuf_len, "⊛←%d/%d→¤ 🅳Zruš 🅰Ulož", page, PAGECOUNT);
            LcdBuffer_Write(&lcd, 3, 0, sbuf);
            break;

        case GUI_EVENT_KEY_B:
        case GUI_EVENT_KEY_STAR:
            if (page > 1) {
                page--;
                clear_menu_lines();
                request_paint();
            }
            break;

        case GUI_EVENT_KEY_C:
        case GUI_EVENT_KEY_HASH:
            if (page < PAGECOUNT) {
                page++;
                clear_menu_lines();
                request_paint();
            }
            break;

        case GUI_EVENT_KEY_A: // SAVE
            memcpy(&app_config, &settings_scratch, APPCONFIG_SIZE);
            appconfig_save();
            switch_screen(screen_home, true);
            break;

        case GUI_EVENT_KEY_D: // CANCEL
            switch_screen(screen_home, true);
            break;

        default:
            switch (page) {
                case 1:
                    switch (event) {
                        case GUI_EVENT_KEY_1: // Program Zap/VYP
                            settings_scratch.scheduler_enable ^= 1;
                            request_paint();
                            break;

                        case GUI_EVENT_KEY_2: // Upravit program
                            switch_to_subscreen(screen_program_prehled);
                            break;

                        case GUI_EVENT_KEY_3: // Nastavit cas
                            switch_to_subscreen(screen_set_time);
                            break;
                    }
                    break;

                case 2:
                    switch (event) {
                        case GUI_EVENT_KEY_1: // Délka zálivky
                            switch_to_subscreen(screen_delka_zalivky);
                            break;

                        case GUI_EVENT_KEY_2: // Kompenzace tlaku
                            switch_to_subscreen(screen_kompenzace_tlaku);
                            break;

                        case GUI_EVENT_KEY_3: // Nastavit suche dny
                            switch_to_subscreen(screen_suche_dny);
                            break;
                    }
                    break;

                case 3:
                    switch (event) {
                        case GUI_EVENT_KEY_1: // Blokace vlhkosti Zap/VYP
                            settings_scratch.moisture_enable ^= 1;
                            request_paint();
                            break;

                        case GUI_EVENT_KEY_2: // Kalibrace vlhkomeru
                            switch_to_subscreen(screen_moisture_calib);
                            break;

                        case GUI_EVENT_KEY_3: // Nastavit prah
                            switch_to_subscreen(screen_set_moisture_threshold);
                            break;
                    }
                    break;
            }
    }
}

static void clear_menu_lines()
{
    LcdBuffer_Write(&lcd, 0, 0, "                    ");
    LcdBuffer_Write(&lcd, 1, 0, "                    ");
    LcdBuffer_Write(&lcd, 2, 0, "                    ");
}