import axios from "axios";

class APIClient {
  constructor(baseURL) {
    this.client = axios.create({
      baseURL: baseURL,
      headers: {
        "Content-Type": "application/json",
      },
    });
  }

  async synthesizeTTS({
    text,
    spk = "female2",
    style = "chat",
    temperature = 0.3,
    top_P = 0.7,
    top_K = 20,
    seed = 34060637,
    format = "mp3",
    prompt1 = "",
    prompt2 = "",
    prefix = "",
  }) {
    try {
      const response = await this.client.get("/v1/tts", {
        params: {
          text,
          spk,
          style,
          temperature,
          top_P,
          top_K,
          seed,
          format,
          prompt1,
          prompt2,
          prefix,
        },
        responseType: "blob", // Important for handling binary data
      });
      return response.data;
    } catch (error) {
      console.error("Error synthesizing TTS:", error);
      throw error;
    }
  }

  /**
   *
   * @param {string} ssml - The SSML text to synthesize
   * @param {string} format - The format of the synthesized audio (e.g. "mp3")
   */
  async synthesizeSSML({ ssml, format = "mp3" }) {
    try {
      const response = await this.client.post(
        "/v1/ssml",
        {
          ssml,
          format,
        },
        {
          responseType: "blob", // Important for handling binary data
        }
      );
      return response.data;
    } catch (error) {
      console.error("Error synthesizing SSML:", error);
      throw error;
    }
  }

  async openaiSpeechAPI({
    input,
    model = "chattts-4w",
    voice = "female2",
    response_format = "mp3",
    speed = 1,
  }) {
    try {
      const response = await this.client.post(
        "/v1/audio/speech",
        {
          input,
          model,
          voice,
          response_format,
          speed,
        },
        {
          responseType: "blob", // Important for handling binary data
        }
      );
      return response.data;
    } catch (error) {
      console.error("Error generating speech audio:", error);
      throw error;
    }
  }

  async refineText({
    text,
    prompt = "[oral_2][laugh_0][break_6]",
    seed = -1,
    top_P = 0.7,
    top_K = 20,
    temperature = 0.7,
    repetition_penalty = 1.0,
    max_new_token = 384,
  }) {
    try {
      const response = await this.client.post("/v1/prompt/refine", {
        text,
        prompt,
        seed,
        top_P,
        top_K,
        temperature,
        repetition_penalty,
        max_new_token,
      });
      return response.data;
    } catch (error) {
      console.error("Error refining text:", error);
      throw error;
    }
  }

  async listStyles() {
    try {
      const response = await this.client.get("/v1/styles/list");
      return response.data;
    } catch (error) {
      console.error("Error listing styles:", error);
      throw error;
    }
  }

  async listSpeakers() {
    try {
      const response = await this.client.get("/v1/speakers/list");
      return response.data;
    } catch (error) {
      console.error("Error listing speakers:", error);
      throw error;
    }
  }

  async createSpeaker({ name, seed }) {
    try {
      const response = await this.client.post("/v1/speaker/create", {
        name,
        seed,
      });
      return response.data;
    } catch (error) {
      console.error("Error creating speaker:", error);
      throw error;
    }
  }
}

export const client = new APIClient(
  localStorage.getItem("__chattts_playground_api_base__") ||
    `${window.location.origin}`
);