package services

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"mime/multipart"
	"net/http"
	"time"

	"github.com/sujit-baniya/fiber-boilerplate/pkg/models"
)

var whisperAsrHTTPClient = &http.Client{Timeout: 120 * time.Second} // audio largo puede tardar

// TranscribirAudioSelfHosted manda un archivo de audio al servicio propio de
// transcripción (whisper-asr-webservice, Basic Auth) y devuelve el texto.
func TranscribirAudioSelfHosted(audioBytes []byte, filename string) (string, error) {
	cfg, err := models.GetWhisperAsrConfig()
	if err != nil {
		return "", fmt.Errorf("el servicio de transcripción no está configurado (Integraciones → Whisper ASR)")
	}
	if filename == "" {
		filename = "audio.wav"
	}

	var buf bytes.Buffer
	w := multipart.NewWriter(&buf)
	fw, err := w.CreateFormFile("audio_file", filename)
	if err != nil {
		return "", err
	}
	if _, err := fw.Write(audioBytes); err != nil {
		return "", err
	}
	_ = w.WriteField("response_format", "json")
	if err := w.Close(); err != nil {
		return "", err
	}

	req, err := http.NewRequest(http.MethodPost, cfg.BaseURL, &buf)
	if err != nil {
		return "", err
	}
	req.Header.Set("Content-Type", w.FormDataContentType())
	req.SetBasicAuth(cfg.Username, cfg.Password)

	resp, err := whisperAsrHTTPClient.Do(req)
	if err != nil {
		return "", fmt.Errorf("no se pudo contactar el servicio de transcripción: %w", err)
	}
	defer resp.Body.Close()
	raw, _ := io.ReadAll(io.LimitReader(resp.Body, 2*1024*1024))

	if resp.StatusCode < 200 || resp.StatusCode >= 300 {
		return "", fmt.Errorf("el servicio de transcripción respondió %d: %s", resp.StatusCode, string(raw))
	}

	var out struct {
		Text string `json:"text"`
	}
	if err := json.Unmarshal(raw, &out); err != nil {
		return "", fmt.Errorf("respuesta inesperada del servicio de transcripción: %s", string(raw))
	}
	return out.Text, nil
}
