#include "./includes/link.h"

int main(int argc, char const *argv[])
{
    STU *head = NULL; // 定义全局的头指针

    // 声明临时变量,用来保存学生信息
    char tsid;
    char tname[32];
    int tage;

    // // 创建几个学生信息，用于测试
    // STU *stu1 = (STU *)malloc(sizeof(STU));
    // stu1->sid = 1;
    // strcpy(stu1->name, "张三");
    // stu1->age = 18;
    // STU *stu2 = (STU *)malloc(sizeof(STU));
    // stu2->sid = 2;
    // strcpy(stu2->name, "李四");
    // stu2->age = 21;
    // STU *stu3 = (STU *)malloc(sizeof(STU));
    // stu3->sid = 3;
    // strcpy(stu3->name, "王五");
    // stu3->age = 15;
    // STU *stu4 = (STU *)malloc(sizeof(STU));
    // stu4->sid = 4;
    // strcpy(stu4->name, "赵六");
    // stu4->age = 13;
    // head = insert_stu(head, stu1);
    // head = insert_stu(head, stu2);
    // head = insert_stu(head, stu3);
    // head = insert_stu(head, stu4);

    while (1)
    {
        // printf("\033[2J");
        // printf("--------------------\n");
        printf("\t\t    \033[%d;%dm学生管理系统\033[0m\n\n", BOLD, CYAN_B);
        printf("\033[%d;%dm1) 添加学生 \t2) 删除学生 \t3) 打印  \n4) 查询  \t5) 修改 \t6) 排序  \n7) 反序  \t8) 加载数据  \t0) 退出(保存数据)\n请输入选项# \033[0m", BOLD, GREEN);
        int cmd = 0;
        scanf("%d", &cmd);
        switch (cmd)
        {
        case 0:
            // store_data(head); // 存储数据
            saveToFile(head, "./data/stu.date");
            return 1;
        case 1:
            printf("输入学生的 学号 姓名 年龄: ");
            // 键盘收集数据并动态插入链表
            scanf("%hhd %s %d", &tsid, tname, &tage); // 键盘收集数据
            STU *item = (STU *)malloc(sizeof(STU));   // 申请一个节点的内存, 用来保存学生信息
            item->sid = tsid;                         // 保存学生学号到新建的节点
            strcpy(item->name, tname);                // 保存学生姓名到新建的节点
            item->age = tage;                         // 保存学生年龄到新建的节点
            item->next = NULL;                        // 新建的节点的下一个节点指向空,因为是尾部插入
            head = insert_stu(head, item);            // 将新建的节点插入到链表中
            break;
        case 2:
            printf("输入要删除的学生的学号: ");
            scanf("%hhd", &tsid);
            head = delete_stu(head, tsid);
            break;
        case 3:
            shows(head);
            break;
        case 4:
            printf("输入要查询的学生的学号: ");
            scanf("%hhd", &tsid);
            head = find_stu(head, tsid);
            if (head == NULL)
            {
                printf("\033[%dm未找到 sid = %d 的学生\033[0m\n", RED, tsid);
            }
            else
            {
                printf("查询到的学生信息如下: \n");
                printf("\033[%dm学号\t姓名\t年龄\033[0m\n", BLUE_B);
                printf("\033[%dm%d\t%s\t%d\033[0m\n", BLUE, head->sid, head->name, head->age);
            }
            break;
        case 5:
            printf("输入要修改的学生的学号:");
            scanf("%hhd", &tsid);
            head = update_stu(head, tsid);
            break;
        case 6:
            printf("排序学生信息:\n");
            head = sort_stu(head);
            break;
        case 7:
            printf("反序学生信息:\n");
            head = reverse_stu(head);
            break;
        case 8:
            printf("加载数据......\n");
            head = readFromFile("./data/stu.date");
            break;
        default:
            printf("\033[%dm选择错误\033[0m\n", RED);
            break;
        }
    }
    return 0;
}
