import { createClient } from "./client";
import { compressImageFile } from "@/lib/utils/image-compression";

export interface StorageUploadResult {
  success: boolean;
  url?: string;
  storagePath?: string;
  error?: string;
}

/**
 * Universal helper that uploads files via /api/upload with service-role authorization
 */
async function uploadToStorage(
  rawFile: File,
  bucket: string,
  userId: string
): Promise<StorageUploadResult> {
  try {
    // Automatically optimize images client-side before upload (reduces 13MB to ~400KB in <100ms)
    const file = await compressImageFile(rawFile);

    const formData = new FormData();
    formData.append("file", file);
    formData.append("bucket", bucket);
    formData.append("userId", userId);

    const res = await fetch("/api/upload", {
      method: "POST",
      body: formData,
    });

    const data = await res.json().catch(() => null);

    if (res.ok && data?.success && data?.url) {
      return {
        success: true,
        url: data.url,
        storagePath: data.storagePath || "",
      };
    }

    // Return the descriptive server error
    return {
      success: false,
      error: data?.error || `Upload failed with status ${res.status}`,
    };
  } catch (apiErr: any) {
    console.error("[Upload API Route Error]:", apiErr);
    return {
      success: false,
      error: apiErr?.message || "Network error while uploading file",
    };
  }
}

/**
 * Uploads a property image to the Supabase Storage 'property-images' bucket
 */
export async function uploadPropertyImage(
  file: File,
  userId: string
): Promise<StorageUploadResult> {
  return uploadToStorage(file, "property-images", userId);
}

/**
 * Uploads a legal/title document to 'property-documents' bucket
 */
export async function uploadPropertyDocument(
  file: File,
  userId: string
): Promise<StorageUploadResult> {
  return uploadToStorage(file, "property-documents", userId);
}

/**
 * Uploads an agency logo or branding banner to 'agency-logos' bucket
 */
export async function uploadAgencyLogo(
  file: File,
  agencyId: string
): Promise<StorageUploadResult> {
  return uploadToStorage(file, "agency-logos", agencyId);
}

/**
 * Uploads a user avatar to 'avatars' bucket
 */
export async function uploadAvatar(
  file: File,
  userId: string
): Promise<StorageUploadResult> {
  return uploadToStorage(file, "avatars", userId);
}

