package services

import (
	"encoding/json"
	"fmt"

	"github.com/sujit-baniya/fiber-boilerplate/app"
	"github.com/sujit-baniya/fiber-boilerplate/utils"
)

// CifrarSecretoUmind / DescifrarSecretoUmind protegen en reposo los
// secretos de terceros de uMind (headers de auth de tools, tokens de
// Telegram/WhatsApp) — mismo patrón AES-GCM + APP_KEY que ya usa el proyecto
// para la contraseña SMTP (utils.Encrypt/Decrypt, ver
// rest/controllers/smtp_config_controller.go), no uno nuevo.
func CifrarSecretoUmind(valor string) (string, error) {
	if valor == "" {
		return "", nil
	}
	if app.Http.Server.Key == "" {
		return "", fmt.Errorf("APP_KEY no está configurada, no se puede cifrar el secreto")
	}
	return utils.Encrypt(valor, app.Http.Server.Key), nil
}

func DescifrarSecretoUmind(valorCifrado string) (string, error) {
	if valorCifrado == "" {
		return "", nil
	}
	if app.Http.Server.Key == "" {
		return "", fmt.Errorf("APP_KEY no está configurada, no se puede descifrar el secreto")
	}
	return utils.Decrypt(valorCifrado, app.Http.Server.Key), nil
}

// CifrarCredencialesCanal / DescifrarCredencialesCanal empaquetan el mapa de
// credenciales de un UmindCanal (bot_token de Telegram; access_token,
// phone_number_id, app_secret y verify_token de WhatsApp) como un único blob
// cifrado en UmindCanal.CredencialesEnc.
func CifrarCredencialesCanal(credenciales map[string]string) (string, error) {
	b, err := json.Marshal(credenciales)
	if err != nil {
		return "", err
	}
	return CifrarSecretoUmind(string(b))
}

func DescifrarCredencialesCanal(credencialesEnc string) (map[string]string, error) {
	plano, err := DescifrarSecretoUmind(credencialesEnc)
	if err != nil {
		return nil, err
	}
	if plano == "" {
		return map[string]string{}, nil
	}
	var credenciales map[string]string
	if err := json.Unmarshal([]byte(plano), &credenciales); err != nil {
		return nil, fmt.Errorf("credenciales del canal corruptas: %w", err)
	}
	return credenciales, nil
}
