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

export const runtime = 'edge';

// Configurar cliente do servidor
const getServerClient = () => {
  const client = new Client()
    .setEndpoint(process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT!)
    .setProject(process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID!)
    .setKey(process.env.APPWRITE_API_KEY!);
  
  return new Databases(client);
};

// 🔍 GET - Listar empresas
export async function GET() {
  console.log('📋 [API] Listando empresas...');

  try {
    // Verificar configurações
    const requiredEnvs = [
      'NEXT_PUBLIC_APPWRITE_ENDPOINT',
      'NEXT_PUBLIC_APPWRITE_PROJECT_ID',
      'NEXT_PUBLIC_APPWRITE_DATABASE_ID',
      'NEXT_PUBLIC_APPWRITE_COLLECTION_EMPRESAS_DADOS_ID',
      'APPWRITE_API_KEY'
    ];

    for (const env of requiredEnvs) {
      if (!process.env[env]) {
        console.error(`❌ [API] Variável ${env} não configurada`);
        return NextResponse.json(
          { success: false, error: `Configuração ausente: ${env}` },
          { status: 500 }
        );
      }
    }

    const databases = getServerClient();
    const databaseId = process.env.NEXT_PUBLIC_APPWRITE_DATABASE_ID!;
    const collectionId = process.env.NEXT_PUBLIC_APPWRITE_COLLECTION_EMPRESAS_DADOS_ID!;

    console.log(`📋 [API] Usando Database: ${databaseId}, Collection: ${collectionId}`);

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

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

  } catch (error: any) {
    console.error('💥 [API] Erro ao listar:', error);
    return NextResponse.json(
      { 
        success: false, 
        error: 'Erro ao carregar empresas',
        details: {
          message: error.message || error,
          code: error.code || null,
          type: error.type || null
        }
      },
      { status: 500 }
    );
  }
}

// ➕ POST - Criar empresa
export async function POST(request: NextRequest) {
  console.log('➕ [API] Criando nova empresa...');
  
  try {
    // Verificar configurações
    const requiredEnvs = [
      'NEXT_PUBLIC_APPWRITE_ENDPOINT',
      'NEXT_PUBLIC_APPWRITE_PROJECT_ID',
      'NEXT_PUBLIC_APPWRITE_DATABASE_ID',
      'NEXT_PUBLIC_APPWRITE_COLLECTION_EMPRESAS_DADOS_ID',
      'APPWRITE_API_KEY'
    ];

    for (const env of requiredEnvs) {
      if (!process.env[env]) {
        console.error(`❌ [API] Variável ${env} não configurada`);
        return NextResponse.json(
          { success: false, error: `Configuração ausente: ${env}` },
          { status: 500 }
        );
      }
    }

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

    // Validar dados obrigatórios
    if (!body.data) {
      return NextResponse.json(
        { success: false, error: 'Dados da empresa são obrigatórios' },
        { status: 400 }
      );
    }

    const { data } = body;
    
    // Validar campos obrigatórios
    if (!data.cnpj || !data['razao-social']) {
      return NextResponse.json(
        { success: false, error: 'CNPJ e Razão Social são obrigatórios' },
        { status: 400 }
      );
    }

    const databases = getServerClient();
    const databaseId = process.env.NEXT_PUBLIC_APPWRITE_DATABASE_ID!;
    const collectionId = process.env.NEXT_PUBLIC_APPWRITE_COLLECTION_EMPRESAS_DADOS_ID!;

    console.log(`📋 [API] Criando em Database: ${databaseId}, Collection: ${collectionId}`);

    const response = await databases.createDocument(
      databaseId,
      collectionId,
      ID.unique(),
      data
    );
    
    console.log('✅ [API] Empresa criada com sucesso!', response.$id);
    return NextResponse.json({ success: true, data: response }, { status: 201 });
    
  } catch (error: any) {
    console.error('💥 [API] Erro na criação:', error);
    
    // Tratamento específico para erros conhecidos
    let errorMessage = 'Erro interno do servidor';
    let statusCode = 500;
    
    if (error.code === 409) {
      errorMessage = 'Empresa já existe com estes dados';
      statusCode = 409;
    } else if (error.code === 400) {
      errorMessage = 'Dados inválidos fornecidos';
      statusCode = 400;
    } else if (error.message) {
      errorMessage = error.message;
    }
    
    return NextResponse.json(
      { 
        success: false, 
        error: errorMessage,
        details: {
          message: error.message || error,
          code: error.code || null,
          type: error.type || null
        }
      },
      { status: statusCode }
    );
  }
}