/**
 * Serviço de Avatars (Frontend)
 */

import axios from "axios";
import { API_CONFIG } from "../api/config";
import type {
  UploadAvatarInput,
  UploadAvatarResponse,
  DeleteAvatarInput,
  GetAvatarUrlInput,
} from "./types";

class AvatarService {
  private readonly SUPABASE_URL = API_CONFIG.SUPABASE_URL;
  private readonly STORAGE_URL = `${this.SUPABASE_URL}/storage/v1/object/avatars`;

  /**
   * Faz upload de avatar do usuário
   */
  async upload(data: UploadAvatarInput): Promise<UploadAvatarResponse> {
    try {
      const token = localStorage.getItem(API_CONFIG.STORAGE_KEYS.ACCESS_TOKEN);
      
      // Determina a extensão do arquivo
      const ext = data.file.name.split(".").pop()?.toLowerCase() || "jpg";
      const path = `${data.userId}/avatar.${ext}`;

      // Cria FormData para o upload
      const formData = new FormData();
      formData.append("file", data.file);

      // Upload usando Supabase Storage API
      await axios.post(
        `${this.STORAGE_URL}/${path}`,
        formData,
        {
          headers: {
            "Authorization": `Bearer ${token}`,
            "Content-Type": "multipart/form-data",
          },
        }
      );

      // Retorna a URL pública
      const publicUrl = this.getPublicUrl({
        userId: data.userId,
        ext: ext as "jpg" | "png" | "webp",
      });

      return {
        Key: publicUrl,
      };
    } catch (error) {
      console.error("Erro ao fazer upload do avatar:", error);
      throw error;
    }
  }

  /**
   * Remove avatar do usuário (sobrescreve com imagem vazia ou remove do perfil)
   */
  async delete(_data: DeleteAvatarInput): Promise<void> {
    try {
      // Não há endpoint de delete, então apenas removemos a referência do perfil
      // O upload futuro irá sobrescrever a imagem antiga
      console.log("Avatar será removido do perfil. Upload futuro sobrescreverá a imagem.");
    } catch (error) {
      console.error("Erro ao deletar avatar:", error);
      throw error;
    }
  }

  /**
   * Retorna a URL pública do avatar
   * Não precisa de autenticação pois é endpoint público
   */
  getPublicUrl(data: GetAvatarUrlInput): string {
    return `${this.STORAGE_URL}/${data.userId}/avatar.${data.ext}`;
  }
}

export const avatarService = new AvatarService();
