const std = @import("std");
const clap = @import("../clap.zig");
const shared = @import("../shared.zig");
const Latency = @import("./_latency.zig");
const get_state = @import("../gmsynth.zig").get_state;

const Logger = Latency.Logger;

pub const ext = clap.clap_plugin_latency_t{
    .get = get_latency,
};

fn get_latency(plugin: ?*const clap.clap_plugin_t) callconv(.C) u32 {
    if (plugin) |cplug| {
        var state = get_state(cplug);
        switch (state) {
            .inited => |*plug| {
                // Make sure this is main thread
                plug.host_data.assert_main_thread() catch return 0;
                // We can only calculate, and thus change latency
                // if we are inactive
                switch (plug.active_state) {
                    .active => {
                        // Use calculated latency
                        Logger.warn("Plugin still active, will not recalculate latency", .{});
                    },
                    .inactive => {
                        // Recalulate
                        plug.latency_ext.calculate(plug);
                    },
                }

                return plug.latency_ext.latency;
            },
            else => {},
        }
    }
    return 0;
}