/*
  Copyright (C) 2026 Intel Corporation
  SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
*/

#include <ittapi.hpp>

#include <chrono>
#include <thread>

static void simulate_work(int ms)
{
    std::this_thread::sleep_for(std::chrono::milliseconds(ms));
}

int main()
{
    // Thread naming
    ittapi::set_thread_name("main");

    // Domain and string handle creation
    ittapi::Domain domain{"example.app"};
    ittapi::StringHandle task_name{"process"};

    // Collection control — pause/resume
    ittapi::pause();
    ittapi::resume();

    // Scoped task with pre-created StringHandle (zero-overhead path)
    {
        auto task = domain.task(task_name);
        simulate_work(10);
    }

    // Scoped task with inline string (convenience path)
    {
        auto task = domain.task("startup");
        simulate_work(10);
    }

    // Scoped task with early end
    {
        auto task = domain.task("partial_work");
        simulate_work(5);
        task.end();  // end early, destructor is a no-op
    }

    // Overlapped tasks — parent and child can end in any order
    {
        auto parent = domain.overlapped_task("parent_task");
        simulate_work(5);

        auto child = domain.overlapped_task("child_task", parent.id());
        simulate_work(5);

        parent.end();   // end parent while child is still running
        simulate_work(5);
    }                   // child ends here via destructor

    // Manual task begin/end (non-RAII, simple task)
    domain.task_begin("manual_work");
    simulate_work(5);
    domain.task_end();

    // Manual overlapped task begin/end (ID-based)
    {
        __itt_id id = __itt_id_make(nullptr, 3);
        domain.task_begin("overlapped_manual", id, __itt_null);
        simulate_work(5);
        domain.task_end(id);
    }

    // Scoped region
    {
        auto region = domain.region("init_phase");
        simulate_work(10);
    }

    // Scoped frame
    {
        auto frame = domain.frame();
        simulate_work(10);
    }

    // Frame submit with explicit timestamps
    {
        __itt_timestamp begin = __itt_get_timestamp();
        simulate_work(10);
        __itt_timestamp end = __itt_get_timestamp();
        ittapi::ScopedFrame::submit(domain.get(), begin, end);
    }

    // Scoped pause — collection paused within scope
    {
        ittapi::ScopedPause sp;
        simulate_work(10);  // not collected
        sp.resume_now();    // resume early
        simulate_work(10);  // collected
    }

    return 0;
}
