// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include <string>

#include "audio_core/common/common.h"
#include "common/common_types.h"

namespace AudioCore::ADSP::AudioRenderer {
class CommandListProcessor;
}

namespace AudioCore::Renderer {
using namespace ::AudioCore::ADSP;

enum class CommandId : u8 {
    /* 0x00 */ Invalid,
    /* 0x01 */ DataSourcePcmInt16Version1,
    /* 0x02 */ DataSourcePcmInt16Version2,
    /* 0x03 */ DataSourcePcmFloatVersion1,
    /* 0x04 */ DataSourcePcmFloatVersion2,
    /* 0x05 */ DataSourceAdpcmVersion1,
    /* 0x06 */ DataSourceAdpcmVersion2,
    /* 0x07 */ Volume,
    /* 0x08 */ VolumeRamp,
    /* 0x09 */ BiquadFilter,
    /* 0x0A */ Mix,
    /* 0x0B */ MixRamp,
    /* 0x0C */ MixRampGrouped,
    /* 0x0D */ DepopPrepare,
    /* 0x0E */ DepopForMixBuffers,
    /* 0x0F */ Delay,
    /* 0x10 */ Upsample,
    /* 0x11 */ DownMix6chTo2ch,
    /* 0x12 */ Aux,
    /* 0x13 */ DeviceSink,
    /* 0x14 */ CircularBufferSink,
    /* 0x15 */ Reverb,
    /* 0x16 */ I3dl2Reverb,
    /* 0x17 */ Performance,
    /* 0x18 */ ClearMixBuffer,
    /* 0x19 */ CopyMixBuffer,
    /* 0x1A */ LightLimiterVersion1,
    /* 0x1B */ LightLimiterVersion2,
    /* 0x1C */ MultiTapBiquadFilter,
    /* 0x1D */ Capture,
    /* 0x1E */ Compressor,
};

constexpr u32 CommandMagic{0xCAFEBABE};

/**
 * A command, generated by the host, and processed by the ADSP's AudioRenderer.
 */
struct ICommand {
    virtual ~ICommand() = default;

    /**
     * Print this command's information to a string.
     *
     * @param processor - The CommandListProcessor processing this command.
     * @param string    - The string to print into.
     */
    virtual void Dump(const AudioRenderer::CommandListProcessor& processor,
                      std::string& string) = 0;

    /**
     * Process this command.
     *
     * @param processor - The CommandListProcessor processing this command.
     */
    virtual void Process(const AudioRenderer::CommandListProcessor& processor) = 0;

    /**
     * Verify this command's data is valid.
     *
     * @param processor - The CommandListProcessor processing this command.
     * @return True if the command is valid, otherwise false.
     */
    virtual bool Verify(const AudioRenderer::CommandListProcessor& processor) = 0;

    /// Command magic 0xCAFEBABE
    u32 magic{};
    /// Command enabled
    bool enabled{};
    /// Type of this command (see CommandId)
    CommandId type{};
    /// Size of this command
    s16 size{};
    /// Estimated processing time for this command
    u32 estimated_process_time{};
    /// Node id of the voice or mix this command was generated from
    u32 node_id{};
};

} // namespace AudioCore::Renderer
