#pragma once

#include "Jikan.h"
#include "Event.h"

#include <iostream>
#include <string>
#include <set>

#ifdef INCLUDE_MPI
    #include <mpi.h>
#endif

class Jikan
{
public:
    std::map<std::string, EventData> Events;
    std::map<std::string, std::set<std::string> > EventType;
    std::string JSONname;
    std::string JSONdata;
    std::string Error;

    Jikan();
    ~Jikan();

    void Jikan_start(const std::string& name, const int& mode);
    void Jikan_end(  const std::string& name);

#ifdef INCLUDE_GPU_TIMER
    void cuda_Jikan_start(const std::string& name);
    void cuda_Jikan_end(  const std::string& name);
#endif

    void GenerateTypedOutputData(const std::string& EventType, std::string& EventTypeString);
    void GenerateOutputData();

// private:
    bool ifContains(const std::string& name);

#ifdef INCLUDE_MPI
    bool ifWriteProc(MPI_Comm comm, int id);
#endif

    bool ifWriteProc();

    void SetDumpFilename(const std::string& name);

private:
    void StartTimer(const std::string& name);
    void BarrierMPI();
    void StartEventTimer(const std::string& name);
    void EndEventTimer(const std::string& name);
};