/*
 * 版权属于：yitter(yitter@126.com)
 * 代码翻译：amuluowin
 * 代码修订：yitter
 */
#include <stdio.h>
#include <stdlib.h>
#include <sys/timeb.h>
#include <pthread.h>
#include <unistd.h>
#include <stdbool.h>
#include "idgen/SnowWorkerM1.h"
#include "idgen/IdGenerator.h"
#include "YitIdHelper.h"

const int GenIdCount = 500000;
const bool multiThread = false;
const int threadCount = 50;
const int method = 1;

void RunMultiThread()
{
    // int64_t start = GetCurrentMicroTime();
    for (int i = 0; i < GenIdCount / threadCount; i++)
    {
        int64_t id = NextId();
        printf("ID: %D\n", id);
    }

    int64_t end = GetCurrentMicroTime();
    // printf("%s，total：%d μs\n", method == 1 ? "1" : "2", (end - start));
}

void RunSingle()
{
    int64_t start = GetCurrentMicroTime();
    for (int i = 0; i < GenIdCount; i++)
    {
        int64_t id = NextId();
        //        printf("ID: %ld\n", id);
    }

    int64_t end = GetCurrentMicroTime();
    printf("%s, total: %d us\n", method == 1 ? "1" : "2", (end - start));
}

int main()
{
    IdGeneratorOptions options = BuildIdGenOptions(1);
    options.Method = method;
    options.WorkerId = 1;
    options.SeqBitLength = 10;
    // options.TopOverCostCount = 2000;
    SetIdGenerator(options);

    pthread_t tid[threadCount];
    while (1)
    {
        if (multiThread)
        {
            for (int i = 0; i < threadCount; i++)
            {
                if (pthread_create(&tid[i], NULL, (void *)RunMultiThread, NULL) != 0)
                {
                    printf("thread creation failed\n");
                    exit(1);
                }
            }
        }
        else
        {
            RunSingle();
        }

        sleep(1);
    }
}
