import { NextResponse, unstable_rootParams } from 'next/server';
import { Client, Databases } 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);
};

// 🔄 PATCH - Atualizar empresa
export async function PATCH(request: Request) {
  try {
    const { id } = await unstable_rootParams();
    console.log('🔄 [API] Atualizando empresa:', id);
    
    // Validar se o ID foi fornecido
    if (!id) {
      console.error('❌ [API] ID da empresa não fornecido');
      return NextResponse.json(
        { success: false, error: 'ID da empresa é obrigatório' },
        { status: 400 }
      );
    }
    
    // Validar formato do ID
    if (typeof id !== 'string' || id.length < 10) {
      console.error('❌ [API] ID da empresa inválido:', id);
      return NextResponse.json(
        { success: false, error: 'ID da empresa inválido' },
        { status: 400 }
      );
    }

    const body = await request.json();
    console.log('📤 [API] Dados para atualização:', body);

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

    const response = await databases.updateDocument(
      databaseId,
      collectionId,
      id,
      body.data || body
    );
    
    console.log('✅ [API] Empresa atualizada com sucesso!');
    return NextResponse.json({ success: true, data: response });
    
  } catch (error: any) {
    console.error('💥 [API] Erro na atualização:', error);
    
    let errorMessage = 'Erro interno do servidor';
    let statusCode = 500;
    
    if (error.code === 404) {
      errorMessage = 'Empresa não encontrada';
      statusCode = 404;
    } 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 }
    );
  }
}

// 🗑️ DELETE - Excluir empresa
export async function DELETE(request: Request) {
  try {
    const { id } = await unstable_rootParams();
    console.log('🗑️ [API] Excluindo empresa:', id);
    
    // Validar se o ID foi fornecido
    if (!id) {
      console.error('❌ [API] ID da empresa não fornecido');
      return NextResponse.json(
        { success: false, error: 'ID da empresa é obrigatório' },
        { status: 400 }
      );
    }
    
    // Validar formato do ID (Appwrite IDs são strings alfanuméricas)
    if (typeof id !== 'string' || id.length < 10) {
      console.error('❌ [API] ID da empresa inválido:', id);
      return NextResponse.json(
        { success: false, error: 'ID da empresa inválido' },
        { 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!;

    // Primeiro verificar se a empresa existe
    try {
      await databases.getDocument(databaseId, collectionId, id);
      console.log('✅ [API] Empresa encontrada, prosseguindo com exclusão');
    } catch (checkError: any) {
      if (checkError.code === 404) {
        console.log('⚠️ [API] Empresa já foi excluída ou não existe:', id);
        return NextResponse.json({ 
          success: true, 
          message: 'Empresa já foi excluída ou não existe' 
        });
      }
      throw checkError; // Re-lançar outros erros
    }

    // Prosseguir com a exclusão
    await databases.deleteDocument(databaseId, collectionId, id);
    
    console.log('✅ [API] Empresa excluída com sucesso!');
    return NextResponse.json({ success: true });
    
  } catch (error: any) {
    console.error('💥 [API] Erro na exclusão:', error);
    
    let errorMessage = 'Erro interno do servidor';
    const statusCode = 500;
    
    if (error.code === 404) {
      console.log('⚠️ [API] Empresa foi excluída durante o processo');
      return NextResponse.json({ 
        success: true, 
        message: 'Empresa foi excluída com sucesso' 
      });
    } 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 }
    );
  }
}
