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

export const runtime = 'edge';

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

  try {
    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 { searchParams } = new URL(request.url);
    const termoBuscado = searchParams.get('q') || '';
    const page = parseInt(searchParams.get('page') || '1', 10);
    const limit = parseInt(searchParams.get('limit') || '10', 10);
    const offset = (page - 1) * limit;

    // Por enquanto, fazer busca simples sem filtros complexos
    const response = await databases.listDocuments(
      databaseId,
      collectionId,
      // queries básicas por enquanto
    );

    console.log(`✅ [API] ${response.documents.length} produtos carregados!`);
    return NextResponse.json({
      success: true,
      documents: response.documents,
      total: response.total,
    });

  } catch (error: any) {
    console.error('❌ [API] Erro ao listar produtos do catálogo:', 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 === 401 ? 401 : 500 }
      );
    }
    
    return NextResponse.json(
      { 
        success: false, 
        error: "Erro interno do servidor", 
        details: error instanceof Error ? error.message : String(error)
      },
      { status: 500 }
    );
  }
}

// ➕ POST - Criar produto no catálogo
export async function POST(request: NextRequest) {
  console.log("➕ [API] Criando produto no catálogo...");

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

    // Validação dos dados obrigatórios
    if (!body.descricao && !body.nome) {
      console.error("❌ [API] Nome ou descrição do produto é obrigatório");
      return NextResponse.json(
        { success: false, error: "Nome ou descrição 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);

    // Preparar dados para criação - usando object flexible para aceitar campos dinâmicos
    const dadosProduto: any = {
      descricao: body.descricao || body.nome,
      nome: body.nome || body.descricao,
    };

    // Adicionar campos opcionais se fornecidos
    if (body['codigo-ean']) {
      dadosProduto['codigo-ean'] = body['codigo-ean'];
    }
    if (body['codigo-interno']) {
      dadosProduto['codigo-interno'] = body['codigo-interno'];
    }
    if (body.observacoes) {
      dadosProduto.observacoes = body.observacoes;
    }
    if (body.laboratorio) {
      dadosProduto.laboratorio = body.laboratorio;
    }

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

    // Tentar criar com dados completos primeiro
    try {
      const novoProduto = await databases.createDocument(
        databaseId,
        collectionId,
        'unique()', // ID único
        dadosProduto
      );

      console.log("✅ [API] Produto criado com sucesso!");
      return NextResponse.json({
        success: true,
        data: novoProduto,
        mensagem: "Produto criado 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 dadosSimplesProduto = {
          descricao: body.descricao || body.nome,
        };
        
        console.log("📝 [API] Tentando com dados simplificados:", dadosSimplesProduto);
        
        const novoProduto = await databases.createDocument(
          databaseId,
          collectionId,
          'unique()',
          dadosSimplesProduto
        );

        console.log("✅ [API] Produto criado com dados simplificados!");
        return NextResponse.json({
          success: true,
          data: novoProduto,
          mensagem: "Produto criado 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(
        { 
          success: false,
          error: `Erro do Appwrite: ${error.message}`, 
          details: {
            code: error.code,
            type: error.type,
            message: error.message
          }
        },
        { status: error.code === 400 ? 400 : 500 }
      );
    }
    
    return NextResponse.json(
      { 
        success: false,
        error: "Erro interno do servidor", 
        details: error instanceof Error ? error.message : String(error)
      },
      { status: 500 }
    );
  }
}
