#pragma once
#include "misc/delegates.h"
#include "misc/singleton/singleton.h"

#include <map>
#include <string>
#include "taskflow/taskflow.hpp"

class plugin_host;
class channel_interface;
class instrument_track;
class mixer_track;
class dummy_track;

class mixer : public singleton_t<mixer> {
    typedef std::pair<int32_t, std::vector<mixer_track*>> layer_type;

public:
    void init(singleton_initliazer& initliazer) override;
    void begin_release(singleton_release_guard &release_guard) override;
    void release(singleton_release_guard& release_guard) override;
    const char* get_name() override { return "mixer"; }

    dummy_track* create_dummy_track(const std::string& in_name);
    instrument_track* create_instrument_track(plugin_host* in_instrument);
    void remove_track(mixer_track* track);
    const std::vector<mixer_track*>& get_tracks() const { return tracks_; }

    void process(uint32_t in_frames);
    void reset();

    [[nodiscard]] dummy_track* get_master() const { return reinterpret_cast<dummy_track*>(tracks_[0]); }
    void build_process_node();
    void request_build_process_node();

    dummy_track* zero_track; // 用于没有任何音频输出的通道

    multicast_delegate<mixer_track*> on_add_track;
    multicast_delegate<mixer_track*> on_add_track_main_thread;
    multicast_delegate<mixer_track*> on_remove_track;
    multicast_delegate<mixer_track*> on_remove_track_main_thread;
private:
    void post_process(uint32_t in_frames) const;
    void thread_register_track(mixer_track* track);
    void thread_remove_track(mixer_track* track);

    void update_taskflow(uint32_t in_frames);

    std::vector<mixer_track*> tracks_;
    std::unordered_map<int32_t, std::vector<mixer_track*>> layer_tracks_;
    std::vector<int32_t> layer_order_;
    std::atomic<tf::Executor*> executor_;
    tf::Taskflow taskflow_;
};

DEFINE_SINGLETON_INSTANCE(mixer)