/* ============================================================================
 * main.c - PC 端 HMI 菜单主程序
 * 功能：菜单交互（主线程）+ TCP 服务器（独立线程），按 Q 退出
 * ========================================================================== */

/* 标准输入输出：printf、fprintf、stderr 等 */
#include <stdio.h>
/* 标准库：malloc、exit、system 等 */
#include <stdlib.h>

#ifdef _WIN32
/* Windows：控制台无回显读键 _getch() */
#include <conio.h>
#else
/* Linux/Unix：终端属性与读键实现 */
#include <termios.h>
#include <unistd.h>
/* 无回显读入一个字符（Linux 下替代 _getch） */
static int getch(void)
{
    struct termios oldt, newt;  /* 当前/新终端属性 */
    int ch;
    tcgetattr(STDIN_FILENO, &oldt);   /* 保存当前终端属性 */
    newt = oldt;                      /* 复制一份用于修改 */
    newt.c_lflag &= ~(ICANON | ECHO); /* 关闭规范模式与回显，实现“按即得” */
    tcsetattr(STDIN_FILENO, TCSANOW, &newt); /* 应用新属性 */
    ch = getchar();                    /* 读一个字符 */
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt); /* 恢复原终端属性 */
    return ch;
}
#endif

#include "Drv/pages/page_manager.h"
#include "Drv/pages/AppInfo/page.h"
#include "Drv/pages/menu/page.h"
#include "Drv/pages/YC/page.h"
#include "TCP/tcp.h"
#include "remoteDisplay.h"
#include "Drv/key.h"
#include "Drv/lcd/lcd.h"
#include "thread_utils.h"

/* ----------------------------------------------------------------------------
 * 程序入口
 * ---------------------------------------------------------------------------- */
int main(void)
{
    uint8_t count = 0;
    input_event_t event;

#ifdef _WIN32
    /* Windows：将控制台代码页设为 UTF-8，避免中文乱码（如“监听”“退出”等） */
    system("chcp 65001 > nul");
#endif

    int server_sock;
    volatile int server_quit;
    thread_handle_t server_th;
    server_thread_arg_t server_arg;


    server_sock = TCP_INVALID_SOCKET;
    server_quit = 0;

    server_arg.port = 7003;
    server_arg.p_server_sock = &server_sock;
    server_arg.p_quit = &server_quit;
    
    printf("开始初始化页面管理器与菜单页面...\n");

    PageManager_Init();
    Lcd_Init();              /* 初始化屏幕显存：由入口统一完成 */
    (void)PageManager_Register(MenuPage_GetInstance());
    (void)PageManager_Register(AppInfoPage_GetInstance());
    (void)PageManager_Register(YCPage_GetInstance());
    (void)PageManager_Navigate(PAGE_ID_MENU);
    Key_Init();              /* 初始化按键 */
    printf("PC 端 HMI 菜单模拟启动（TCP 服务在单独线程，端口 7003）。\n");
    /* 7003 为 RemoDispBus 默认端口，与 remo_disp_server.py 一致 */
    if (StartTcpServerThread(&server_th, &server_arg) != 0)
    {
        return 1;
    }
    while(1) 
    { 
        uint8_t keyVal = Key_Read();
        if (keyVal != KEY_NONE)
        {
            event.type = PAGE_EVENT_KEY;
            event.keyVal = keyVal;
            PageManager_DispatchEvent(&event);
        }
        Sleep(20);
        count++;
        if(count > 50)
        {
            count = 0;
            PageManager_Loop();
        }
    }

    server_quit = 1;   /* 通知服务器线程退出：下一轮 while 或 Accept 返回后会结束循环 */
    if (server_sock != TCP_INVALID_SOCKET) {  /* 若监听 socket 已有效（服务器线程已启动成功） */
        TcpServer_Close(server_sock);         /* 关闭监听，使 Accept 返回，服务器线程得以退出 */
        server_sock = TCP_INVALID_SOCKET;     /* 避免重复关闭 */
    }
    Thread_Join(server_th);  /* 等待服务器线程完全退出 */
    Tcp_Cleanup();           /* 清理网络库（Windows 下必须调用） */
    return 0;
}
