/*
 * Copyright 2022 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkPerfettoTrace_DEFINED
#define SkPerfettoTrace_DEFINED

#include "include/utils/SkEventTracer.h"
#include "tools/trace/EventTracingPriv.h"
#include "perfetto.h"

PERFETTO_DEFINE_CATEGORIES();

/**
 * This class is used to support Perfetto tracing. It hooks into the SkEventTracer system.
 */
class SkPerfettoTrace : public SkEventTracer {
public:
    SkPerfettoTrace();

    SkEventTracer::Handle addTraceEvent(char phase,
                                        const uint8_t* categoryEnabledFlag,
                                        const char* name,
                                        uint64_t id,
                                        int numArgs,
                                        const char** argNames,
                                        const uint8_t* argTypes,
                                        const uint64_t* argValues,
                                        uint8_t flags) override;


    void updateTraceEventDuration(const uint8_t* categoryEnabledFlag,
                                  const char* name,
                                  SkEventTracer::Handle handle) override;

    const uint8_t* getCategoryGroupEnabled(const char* name) override;

    const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override;

    void newTracingSection(const char* name) override;

private:
    SkPerfettoTrace(const SkPerfettoTrace&) = delete;
    SkPerfettoTrace& operator=(const SkPerfettoTrace&) = delete;
    SkEventTracingCategories fCategories;
    std::unique_ptr<perfetto::TracingSession> tracingSession;
    int fd{-1};

    /** Store the perfetto trace file output path, name, and extension separately. This isolation
     * of name components becomes useful when splitting traces up by sections, where we want to
     * alter the base file name but keep the trace output path and file extension the same.
     */
    std::string fOutputPath;
    std::string fOutputFileExtension;
    std::string fCurrentSessionFullOutputPath;

    void openNewTracingSession(const std::string& baseFileName);
    void closeTracingSession();

    void onExit() override { this->closeTracingSession(); }

    /** Overloaded private methods to initiate a trace event with 0-2 arguments. Perfetto supports
     * adding an arbitrary number of debug annotations or arguments, but the existing Skia trace
     * structure only supports 0-2 so that is all we accommodate.
     */
    void triggerTraceEvent(const uint8_t* categoryEnabledFlag, const char* eventName);
    void triggerTraceEvent(const uint8_t* categoryEnabledFlag, const char* eventName,
                           const char* arg1Name, const uint8_t& arg1Type, const uint64_t& arg1Val);
    void triggerTraceEvent(const uint8_t* categoryEnabledFlag, const char* eventName,
                           const char* arg1Name, const uint8_t& arg1Type, const uint64_t& arg1Val,
                           const char* arg2Name, const uint8_t& arg2Type, const uint64_t& arg2Val);
};

#endif
