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

export const runtime = 'edge';

// 🔍 GET - Obter produto específico
export async function GET(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  console.log("🔍 [API] Obtendo produto específico...");

  try {
    const { id } = await params;
    console.log("📄 [API] ID do produto:", id);

    if (!id) {
      console.error("❌ [API] ID do produto é obrigatório");
      return NextResponse.json(
        { success: false, error: "ID do produto é obrigatório" },
        { status: 400 }
      );
    }

    // Verificar variáveis de ambiente
    const apiKey = process.env.APPWRITE_API_KEY;
    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_CATALOGO_PRODUTOS_ID;
    
    console.log("🔧 [API] Configurações:", {
      hasApiKey: !!apiKey,
      endpoint: endpoint,
      projectId: projectId,
      databaseId: databaseId,
      collectionId: collectionId
    });

    if (!apiKey) {
      console.error("❌ [API] APPWRITE_API_KEY não configurada");
      return NextResponse.json(
        { success: false, error: "Configuração do servidor ausente - API Key" },
        { status: 500 }
      );
    }

    if (!endpoint || !projectId || !databaseId || !collectionId) {
      console.error("❌ [API] Variáveis de ambiente faltando");
      return NextResponse.json(
        { success: false, error: "Configuração do servidor incompleta" },
        { status: 500 }
      );
    }

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

    const databases = new Databases(client);

    const produto = await databases.getDocument(
      databaseId,
      collectionId,
      id
    );

    console.log("✅ [API] Produto obtido com sucesso!");
    return NextResponse.json({
      success: true,
      data: produto,
    });

  } catch (error: any) {
    console.error("❌ [API] Erro ao obter produto:", error);
    
    // Tratamento específico para erros do Appwrite
    if (error.code) {
      return NextResponse.json(
        { 
          success: false, 
          error: `Erro do Appwrite: ${error.message}`, 
          details: {
            code: error.code,
            type: error.type,
            message: error.message
          }
        },
        { status: error.code === 404 ? 404 : 500 }
      );
    }
    
    return NextResponse.json(
      { 
        success: false, 
        error: "Erro interno do servidor", 
        details: error instanceof Error ? error.message : String(error)
      },
      { status: 500 }
    );
  }
}

// 📝 PATCH - Atualizar produto
export async function PATCH(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  console.log("📝 [API] Atualizando produto...");

  try {
    const { id } = await params;
    const body = await request.json();
    console.log("📄 [API] ID:", id, "Dados:", body);

    if (!id) {
      console.error("❌ [API] ID do produto é obrigatório");
      return NextResponse.json(
        { success: false, error: "ID do produto é obrigatório" },
        { status: 400 }
      );
    }

    const apiKey = process.env.APPWRITE_API_KEY;
    if (!apiKey) {
      console.error("❌ [API] APPWRITE_API_KEY não configurada");
      return NextResponse.json(
        { success: false, error: "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_CATALOGO_PRODUTOS_ID!;

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

    const databases = new Databases(client);

    const produtoAtualizado = await databases.updateDocument(
      databaseId,
      collectionId,
      id,
      body
    );

    console.log("✅ [API] Produto atualizado com sucesso!");
    return NextResponse.json({
      success: true,
      data: produtoAtualizado,
      mensagem: "Produto atualizado com sucesso!",
    });

  } catch (error: any) {
    console.error("❌ [API] Erro ao atualizar produto:", error);
    
    // Tratamento específico para erros do Appwrite
    if (error.code) {
      return NextResponse.json(
        { 
          success: false, 
          error: `Erro do Appwrite: ${error.message}`, 
          details: {
            code: error.code,
            type: error.type,
            message: error.message
          }
        },
        { status: error.code === 404 ? 404 : 500 }
      );
    }
    
    return NextResponse.json(
      { 
        success: false, 
        error: "Erro interno do servidor", 
        details: error instanceof Error ? error.message : String(error)
      },
      { status: 500 }
    );
  }
}

// 🗑️ DELETE - Excluir produto
export async function DELETE(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  console.log("🗑️ [API] Excluindo produto...");

  try {
    const { id } = await params;
    console.log("📄 [API] ID do produto a excluir:", id);

    if (!id) {
      console.error("❌ [API] ID do produto é obrigatório");
      return NextResponse.json(
        { success: false, error: "ID do produto é obrigatório" },
        { status: 400 }
      );
    }

    const apiKey = process.env.APPWRITE_API_KEY;
    if (!apiKey) {
      console.error("❌ [API] APPWRITE_API_KEY não configurada");
      return NextResponse.json(
        { success: false, error: "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_CATALOGO_PRODUTOS_ID!;

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

    const databases = new Databases(client);

    await databases.deleteDocument(
      databaseId,
      collectionId,
      id
    );

    console.log("✅ [API] Produto excluído com sucesso!");
    return NextResponse.json({
      success: true,
      mensagem: "Produto excluído com sucesso!",
    });

  } catch (error: any) {
    console.error("❌ [API] Erro ao excluir produto:", error);
    
    // Tratamento específico para erros do Appwrite
    if (error.code) {
      return NextResponse.json(
        { 
          success: false, 
          error: `Erro do Appwrite: ${error.message}`, 
          details: {
            code: error.code,
            type: error.type,
            message: error.message
          }
        },
        { status: error.code === 404 ? 404 : 500 }
      );
    }
    
    return NextResponse.json(
      { 
        success: false, 
        error: "Erro interno do servidor", 
        details: error instanceof Error ? error.message : String(error)
      },
      { status: 500 }
    );
  }
}