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

import { apiClient } from "../api/client";
import type {
  UploadAvatarInput,
  UploadAvatarResponse,
  DeleteAvatarInput,
  GetAvatarUrlInput,
} from "./types";

class AvatarService {
  /**
   * Faz upload de avatar do usuário
   */
  async upload(data: UploadAvatarInput): Promise<UploadAvatarResponse> {
    try {
      // Converte arquivo para base64
      const fileData = await this.fileToBase64(data.file);

      const response = await apiClient.post<UploadAvatarResponse>(
        `/avatars-upload?userId=${data.userId}`,
        {
          fileData,
          contentType: data.file.type,
          fileName: data.file.name,
        },
        {
          headers: {
            "Content-Type": "application/json",
          },
        }
      );

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

  /**
   * Converte File para base64
   */
  private fileToBase64(file: File): Promise<string> {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = () => {
        const result = reader.result as string;
        // Remove o prefixo "data:image/...;base64,"
        const base64 = result.split(",")[1];
        resolve(base64);
      };
      reader.onerror = reject;
      reader.readAsDataURL(file);
    });
  }

  /**
   * Remove avatar do usuário
   */
  async delete(data: DeleteAvatarInput): Promise<void> {
    try {
      await apiClient.delete(`/avatars-delete?userId=${data.userId}`);
    } 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 {
    const SUPABASE_URL = "https://yuanqfswhberkoevtmfr.supabase.co";
    return `${SUPABASE_URL}/storage/v1/object/public/avatars/${data.userId}/avatar.${data.ext}`;
  }
}

export const avatarService = new AvatarService();
