import { NextRequest, NextResponse } from "next/server";
import { Client, Databases, Query } from "node-appwrite";

// Runtime edge para melhor performance
export const runtime = "edge";

// 🔍 GET - Listar subcategorias
export async function GET(request: NextRequest) {
  console.log("📋 [API] Listando subcategorias...");

  try {
    const apiKey = process.env.APPWRITE_API_KEY;
    if (!apiKey) {
      console.error("❌ [API] APPWRITE_API_KEY não configurada");
      return NextResponse.json(
        { sucesso: false, erro: "Configuração do servidor ausente" },
        { status: 500 }
      );
    }

    const endpoint = process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT!;
    const projectId = process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID!;
    const databaseId = process.env.NEXT_PUBLIC_APPWRITE_DATABASE_ID!;
    const collectionId =
      process.env.NEXT_PUBLIC_APPWRITE_COLLECTION_SUBCATEGORIAS_ID!;

    const client = new Client()
      .setEndpoint(endpoint)
      .setProject(projectId)
      .setKey(apiKey);

    const databases = new Databases(client);

    const { searchParams } = new URL(request.url);
    const categoriaId = searchParams.get("categoriaId");

    let queries = [];

    if (categoriaId) {
      queries.push(Query.equal("categoria", categoriaId));
    }

    const response = await databases.listDocuments(
      databaseId,
      collectionId,
      queries
    );

    console.log(
      `✅ [API] ${response.documents.length} subcategorias carregadas!`
    );
    return NextResponse.json({
      sucesso: true,
      subcategorias: response.documents,
      total: response.total,
    });
  } catch (error) {
    console.error("💥 [API] Erro ao listar subcategorias:", error);
    return NextResponse.json(
      { sucesso: false, erro: "Erro ao carregar subcategorias" },
      { status: 500 }
    );
  }
}

// ➕ POST - Criar subcategoria
export async function POST(request: NextRequest) {
  console.log("➕ [API] Criando nova subcategoria...");

  try {
    const body = await request.json();
    console.log("📤 [API] Dados recebidos:", body);

    const apiKey = process.env.APPWRITE_API_KEY;
    if (!apiKey) {
      console.error("❌ [API] APPWRITE_API_KEY não configurada");
      return NextResponse.json(
        { sucesso: false, erro: "Configuração do servidor ausente" },
        { status: 500 }
      );
    }

    const endpoint = process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT!;
    const projectId = process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID!;
    const databaseId = process.env.NEXT_PUBLIC_APPWRITE_DATABASE_ID!;
    const collectionId =
      process.env.NEXT_PUBLIC_APPWRITE_COLLECTION_SUBCATEGORIAS_ID!;

    // Validação dos dados obrigatórios
    if (!body.nome?.trim()) {
      console.error("❌ [API] Nome da subcategoria é obrigatório");
      return NextResponse.json(
        { sucesso: false, erro: "Nome da subcategoria é obrigatório" },
        { status: 400 }
      );
    }

    if (!body.categoria?.trim()) {
      console.error("❌ [API] Categoria pai é obrigatória");
      return NextResponse.json(
        { sucesso: false, erro: "Categoria pai é obrigatória" },
        { status: 400 }
      );
    }

    const client = new Client()
      .setEndpoint(endpoint)
      .setProject(projectId)
      .setKey(apiKey);

    const databases = new Databases(client);

    // Preparar dados para criação - estrutura robusta
    const dadosSubcategoria = {
      nome: body.nome.trim(),
      categoria: body.categoria.trim(),
      descricao: body.descricao?.trim() || "",
      slug: body.slug?.trim() || body.nome.toLowerCase().replace(/\s+/g, "-"),
    };

    console.log("📝 [API] Dados preparados para criação:", dadosSubcategoria);

    // Tentar criar com dados completos primeiro
    try {
      const novaSubcategoria = await databases.createDocument(
        databaseId,
        collectionId,
        'unique()', // Usar string em vez de ID.unique()
        dadosSubcategoria
      );

      console.log("✅ [API] Subcategoria criada com sucesso:", novaSubcategoria.$id);

      return NextResponse.json({
        sucesso: true,
        success: true, // Compatibilidade dupla
        subcategoria: novaSubcategoria,
        data: novaSubcategoria,
        mensagem: `Subcategoria "${body.nome}" criada com sucesso!`,
      });
      
    } catch (createError: any) {
      console.warn("⚠️ [API] Primeira tentativa falhou, tentando com dados simplificados:", createError.message);
      
      // Se falhar, tentar apenas com dados essenciais
      try {
        const dadosSimplesSubcategoria = {
          nome: body.nome.trim(),
          categoria: body.categoria.trim(),
        };
        
        console.log("📝 [API] Tentando com dados simplificados:", dadosSimplesSubcategoria);
        
        const novaSubcategoria = await databases.createDocument(
          databaseId,
          collectionId,
          'unique()',
          dadosSimplesSubcategoria
        );

        console.log("✅ [API] Subcategoria criada com dados simplificados!");
        return NextResponse.json({
          sucesso: true,
          success: true,
          subcategoria: novaSubcategoria,
          data: novaSubcategoria,
          mensagem: `Subcategoria "${body.nome}" criada com sucesso (modo simplificado)!`,
        });
        
      } catch (secondError: any) {
        console.error("❌ [API] Segunda tentativa também falhou:", secondError);
        throw secondError; // Deixar o catch principal tratar
      }
    }

  } catch (error: any) {
    console.error("💥 [API] Erro na criação:", error);
    
    // Tratamento específico para erros do Appwrite
    if (error.code) {
      return NextResponse.json(
        { 
          sucesso: false,
          success: false,
          erro: `Erro do Appwrite: ${error.message}`, 
          details: {
            code: error.code,
            type: error.type,
            message: error.message
          }
        },
        { status: error.code === 400 ? 400 : 500 }
      );
    }
    
    return NextResponse.json(
      { 
        sucesso: false,
        success: false,
        erro: "Erro interno do servidor", 
        details: error instanceof Error ? error.message : String(error)
      },
      { status: 500 }
    );
  }
}
