// @Time    :   2023-10-23 19:40:03
// @FileName:   main.cpp
// @Author  :   423A35C7
// @Software:   VSCode

#include "MVC.h" // 应该是cmake里不应该重复include一遍
using namespace std;

// 以下的是通过向类传递参数设置的
int probability_num = DEFAULT_PROBABILITY_NUM; // 每个时刻有1/probability_num的概率来人
int speed = DEFAULT_SPEED;                     // 每个窗口办理的速度
int_ total_time = DEFAULT_TOTAL_TIME;          // 总时刻数
int max_money = MAX_MONEY;                     // 最大携带金额
int window_num = DEFAULT_WINDOW_NUM;           // 柜台数量
double walk_speed = DEFAULT_WALK_SPEED;           // 人的走路速度

// 以下的是通过全局变量设置的
int sleep_time = DEFAULT_SLEEP_TIME; // 每次刷新间隔多少毫秒
int base_x = DEFAULT_BASE_X;         // 起始位置距离终端上边几个字符的距离
int base_y = DEFAULT_BASE_Y;         // 起始位置距离终端左边几个字符的距离
int sep = DEFAULT_SEP;               // 每个窗口间隔多少距离
int gate_x = DEFAULT_GATE_X;         // 大门的位置终端上边几个字符的距离
int gate_y = DEFAULT_GATE_Y;         // 大门的位置终端左边几个字符的距离
unsigned seed = DEFAULT_RANDOM_SEED; // 随机数种子

template <typename T>
Status get_input(T &variable, string prompt) {
    cout << "请输入" << prompt << "（默认值" << variable << "）： ";
    while (true) {
        if (cin >> variable) {
            break;
        }
        cin.clear();
        cin.ignore(2048, '\n');
        cout << "输入错误，请重新输入：";
    }
    return OK;
}

int main(int, char **) {
    // std::cout << "Hello, from 第三章作业!\n";
    srand(seed);
    int mode = 2;
    get_input(mode, "模式，1为单个队列，2为多个队列，3为自定义，其他整数表示退出");
    switch (mode) {
    case 1:
        return main_simple();
        break;
    case 2:
        return main_multi();
        break;
    case 3:
        get_input<int>(probability_num, "每个时刻有1/{输入值}的概率来人");
        get_input<int>(speed, "每个窗口办理的速度");
        get_input<int_>(total_time, "总时刻数");
        get_input<int>(max_money, "最大携带金额");
        get_input<int>(window_num, "柜台数量");
        get_input<double>(walk_speed, "人的走路速度（浮点数）");
        get_input<int>(sleep_time, "每次刷新间隔多少毫秒");
        get_input<unsigned>(seed, "随机数种子");
        srand(seed);
        return main_multi();
        break;
    }
    return OK;
}
