#include <chrono>
#include <thread>
#include <vector>
#include <iostream>
#include <condition_variable>
#include <cstdlib>
#include <math.h>

#include <easy/profiler.h>
#include <easy/reader.h>

int OBJECTS = 500;

void modellingThread(){
    EASY_THREAD("Modelling");

    static const int N = OBJECTS;

    volatile double *pos[N];
    for (int i = 0; i < N; ++i)
    {
        pos[i] = new volatile double[3];
    }

    {
        EASY_BLOCK("Collisions");
        volatile int i, j;
        volatile double dist;
        for (i = 0; i < N; ++i)
        {
            for (j = i + 1; j < N; ++j)
            {
                EASY_BLOCK("Check");
                volatile double v[3];
                v[0] = pos[i][0] - pos[j][0];
                v[1] = pos[i][1] - pos[j][1];
                v[2] = pos[i][2] - pos[j][2];
                dist = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
                if (dist < 10000)
                {
                    dist *= dist;
                }
            }
        }
    }

    for (int i = 0; i < N; ++i)
    {
        delete [] pos[i];
    }
}

//////////////////////////////////////////////////////////////////////////

int main(int argc, char* argv[])
{
    if (argc > 1 && argv[1]){
        OBJECTS = std::atoi(argv[1]);
    }

    std::cout << "Objects count: " << OBJECTS << std::endl;

    auto start = std::chrono::system_clock::now();


    EASY_PROFILER_ENABLE;
    EASY_MAIN_THREAD;


    modellingThread();

    auto end = std::chrono::system_clock::now();
    auto elapsed =
            std::chrono::duration_cast<std::chrono::microseconds>(end - start);

    std::cout << "Elapsed time: " << elapsed.count() << " usec" << std::endl;

    auto blocks_count = profiler::dumpBlocksToFile("test.prof");

    std::cout << "Blocks count: " << blocks_count << std::endl;

    return 0;
}