import { z } from "zod";
import { formatErrorForMcp } from "../utils/errors.js";
export function registerAudioTools(server, godot) {
    server.tool("get_audio_bus_layout", "Get the entire audio bus layout: all buses with volumes, effects, send targets, solo/mute states", {}, async (params) => {
        try {
            const result = await godot.sendCommand("get_audio_bus_layout", params);
            return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
        }
        catch (e) {
            return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true };
        }
    });
    server.tool("add_audio_bus", "Add a new audio bus with name, volume, send target, solo, and mute settings", {
        name: z.string().describe("Name for the new audio bus"),
        volume_db: z.number().optional().describe("Volume in dB (default: 0)"),
        send: z.string().optional().describe("Name of the bus to send output to (e.g. 'Master')"),
        solo: z.boolean().optional().describe("Solo this bus (default: false)"),
        mute: z.boolean().optional().describe("Mute this bus (default: false)"),
        at_position: z.number().optional().describe("Bus index position to insert at (-1 = end)"),
    }, async (params) => {
        try {
            const result = await godot.sendCommand("add_audio_bus", params);
            return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
        }
        catch (e) {
            return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true };
        }
    });
    server.tool("set_audio_bus", "Modify an existing audio bus: volume, solo, mute, bypass_effects, send, or rename", {
        name: z.string().describe("Name of the audio bus to modify"),
        volume_db: z.number().optional().describe("Volume in dB"),
        solo: z.boolean().optional().describe("Solo state"),
        mute: z.boolean().optional().describe("Mute state"),
        bypass_effects: z.boolean().optional().describe("Bypass all effects on this bus"),
        send: z.string().optional().describe("Name of the bus to send output to"),
        rename: z.string().optional().describe("New name for the bus"),
    }, async (params) => {
        try {
            const result = await godot.sendCommand("set_audio_bus", params);
            return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
        }
        catch (e) {
            return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true };
        }
    });
    server.tool("add_audio_bus_effect", "Add an audio effect to a bus. Types: reverb, chorus, delay, compressor, limiter, phaser, distortion, lowpassfilter, highpassfilter, bandpassfilter, amplify, eq", {
        bus: z.string().describe("Name of the audio bus"),
        effect_type: z.string().describe("Effect type: reverb, chorus, delay, compressor, limiter, phaser, distortion, lowpassfilter (or lowpass), highpassfilter (or highpass), bandpassfilter (or bandpass), amplify, eq"),
        params: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional().describe("Effect-specific parameters. E.g. for reverb: {room_size, damping, wet, dry, spread}; for compressor: {threshold, ratio, attack_us, release_ms}; for filters: {cutoff_hz, resonance}"),
        at_position: z.number().optional().describe("Effect index position (-1 = end)"),
    }, async (params) => {
        try {
            const result = await godot.sendCommand("add_audio_bus_effect", params);
            return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
        }
        catch (e) {
            return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true };
        }
    });
    server.tool("add_audio_player", "Add an AudioStreamPlayer, AudioStreamPlayer2D, or AudioStreamPlayer3D node to a parent node", {
        node_path: z.string().describe("Path to the parent node"),
        name: z.string().describe("Name for the new audio player node"),
        type: z.string().optional().describe("Player type: AudioStreamPlayer (default), AudioStreamPlayer2D, AudioStreamPlayer3D"),
        stream: z.string().optional().describe("Path to audio resource (e.g. 'res://audio/music.ogg')"),
        volume_db: z.number().optional().describe("Volume in dB (default: 0)"),
        bus: z.string().optional().describe("Audio bus name (default: 'Master')"),
        autoplay: z.boolean().optional().describe("Auto-play when scene starts (default: false)"),
        max_distance: z.number().optional().describe("Maximum hearing distance (for 2D/3D players)"),
        attenuation: z.number().optional().describe("Distance attenuation factor (for 2D players)"),
        attenuation_model: z.number().optional().describe("Attenuation model for 3D: 0=inverse_distance, 1=inverse_square, 2=logarithmic"),
        unit_size: z.number().optional().describe("Unit size for 3D player volume reference"),
    }, async (params) => {
        try {
            const result = await godot.sendCommand("add_audio_player", params);
            return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
        }
        catch (e) {
            return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true };
        }
    });
    server.tool("get_audio_info", "Get audio setup for a node subtree: finds all AudioStreamPlayer nodes with their settings, streams, and bus assignments", {
        node_path: z.string().describe("Path to the root node to search within"),
    }, async (params) => {
        try {
            const result = await godot.sendCommand("get_audio_info", params);
            return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
        }
        catch (e) {
            return { content: [{ type: "text", text: formatErrorForMcp(e) }], isError: true };
        }
    });
}
//# sourceMappingURL=audio-tools.js.map