// #include <unistd.h>
#include <iostream>
#include <memory>
#include <thread>
#include <mutex>
#include <queue>
#include <condition_variable>
#include <functional>
#include <future>
#include <numeric>
#include <cmath>
#include <list>
#include <iterator>
#include "ThreadPool.h"

#include "loginit.h"
#include "spdlog/spdlog.h"

/* 模拟子线程 */
void print(int a)
{
    SPDLOG_DEBUG("这是一个子线程:{}", a);
    std::this_thread::sleep_for(std::chrono::seconds(a + 1));
    SPDLOG_DEBUG("子线程:{}运行结束", a);
}

int ret_print(int a)
{
    // SPDLOG_DEBUG("这是一个子线程:{}", a);
    std::this_thread::sleep_for(std::chrono::seconds(a + 1));
    SPDLOG_DEBUG("子线程:{}运行结束", a);
    return a;
}

int main(int argc, char *argv[])
{
    using namespace std;
    init_log();

    auto logger = spdlog::get("main");

    SPDLOG_LOGGER_INFO(logger,"**********  Hello ThreadPool  **********");

    ThreadPool &tp = ThreadPool::getInstance();

    SPDLOG_LOGGER_DEBUG(logger,"线程池最大线程个数:{}", tp.getThreadMaxNum());
    SPDLOG_LOGGER_DEBUG(logger,"线程池最小线程个数:{}", tp.getThreadMiniNum());
    SPDLOG_LOGGER_DEBUG(logger,"线程池空闲线程的个数:{}", tp.getThreadIdleNum());
    SPDLOG_LOGGER_DEBUG(logger,"线程池正在运行的线程个数:{}", tp.getThreadRunNum());
    SPDLOG_LOGGER_DEBUG(logger,"线程池现存的线程个数:{}", tp.getThreadLiveNum());
    SPDLOG_LOGGER_DEBUG(logger,"线程池每次创建线程的个数:{}", tp.getThreadAddNum());
    SPDLOG_LOGGER_DEBUG(logger,"线程池最小空闲线程的个数:{}", tp.getThreadMiniIdle());
    SPDLOG_LOGGER_DEBUG(logger,"线程池最大空闲线程的个数:{}", tp.getThreadMaxIdle());

    SPDLOG_LOGGER_DEBUG(logger,"***** 开始给线程添加任务 ******\n");

    // for (int i = 0; i < 20; i++)
    // {
    //     tp.add_Task(print, i);
    //     std::this_thread::sleep_for(std::chrono::microseconds(100));
    // }
    std::vector<std::future<int>> vec;
    for(int i = 0; i < 20; i++)
    {
        vec.emplace_back(tp.add_task_with_ret(ret_print, i));
    }

    for(auto& it : vec)
    {
        SPDLOG_LOGGER_DEBUG(logger,"返回值:{}", it.get());
    }

    while(getchar() != 'q')
    {
        SPDLOG_LOGGER_DEBUG(logger,"=================== 线程池状态 ===================");
        SPDLOG_LOGGER_DEBUG(logger,"线程池最大线程个数:{}", tp.getThreadMaxNum());
        SPDLOG_LOGGER_DEBUG(logger,"线程池最小线程个数:{}", tp.getThreadMiniNum());
        SPDLOG_LOGGER_DEBUG(logger,"线程池空闲线程的个数:{}", tp.getThreadIdleNum());
        SPDLOG_LOGGER_DEBUG(logger,"线程池正在运行的线程个数:{}", tp.getThreadRunNum());
        SPDLOG_LOGGER_DEBUG(logger,"线程池现存的线程个数:{}", tp.getThreadLiveNum());
        SPDLOG_LOGGER_DEBUG(logger,"线程池每次创建线程的个数:{}", tp.getThreadAddNum());
        SPDLOG_LOGGER_DEBUG(logger,"线程池最小空闲线程的个数:{}", tp.getThreadMiniIdle());
        SPDLOG_LOGGER_DEBUG(logger,"线程池最大空闲线程的个数:{}", tp.getThreadMaxIdle());

        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    // while(true)
    // {
    //     std::this_thread::sleep_for(std::chrono::seconds(5));
    // }

    return 0;
}