import { NextRequest, NextResponse } from "next/server";
import { databases, Query } from "@/lib/appwrite";

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

const DATABASE_ID = process.env.NEXT_PUBLIC_APPWRITE_DATABASE_ID!;
const COLLECTION_CATALOGO =
  process.env.NEXT_PUBLIC_APPWRITE_COLLECTION_CATALOGO_PRODUTOS_ID!;
const COLLECTION_CATEGORIAS =
  process.env.NEXT_PUBLIC_APPWRITE_COLLECTION_CATEGORIAS_ID!;

// Mapeamento de produtos para categorias
const mapeamentoCategorias: { [key: string]: string } = {
  dipirona: "RX",
  cetaphil: "Dermo",
  sabonete: "Dermo",
  dermo: "Dermo",
  vitamina: "Nutrição",
  suplemento: "Nutrição",
  generico: "Genérico",
  diabetes: "Diabetes",
  insulina: "Diabetes",
  medicamento: "RX",
  remedio: "RX",
};

export async function POST(request: NextRequest) {
  try {
    console.log("🔗 [API] Iniciando relacionamento de categorias...");

    // 1. Buscar todas as categorias
    const categoriasResponse = await databases.listDocuments(
      DATABASE_ID,
      COLLECTION_CATEGORIAS,
      [Query.limit(100)]
    );

    console.log(
      `📋 [API] Encontradas ${categoriasResponse.documents.length} categorias`
    );

    const categorias = categoriasResponse.documents;
    const categoriasPorNome: { [key: string]: string } = {};

    categorias.forEach((cat) => {
      categoriasPorNome[cat.nome.toLowerCase()] = cat.$id;
    });

    console.log(
      "📋 [API] Categorias disponíveis:",
      Object.keys(categoriasPorNome)
    );

    // 2. Buscar todos os produtos do catálogo
    const produtosResponse = await databases.listDocuments(
      DATABASE_ID,
      COLLECTION_CATALOGO,
      [Query.limit(100)]
    );

    console.log(
      `📦 [API] Encontrados ${produtosResponse.documents.length} produtos`
    );

    const produtos = produtosResponse.documents;
    const resultados = [];

    // 3. Para cada produto, determinar e atribuir categoria
    for (const produto of produtos) {
      const descricao = produto.descricao.toLowerCase();
      let categoriaEncontrada = null;
      let nomeCategoria = "";

      // Tentar encontrar categoria por palavra-chave
      for (const [palavra, nomeCategoriaMapeada] of Object.entries(
        mapeamentoCategorias
      )) {
        if (descricao.includes(palavra)) {
          const categoriaId =
            categoriasPorNome[nomeCategoriaMapeada.toLowerCase()];
          if (categoriaId) {
            categoriaEncontrada = categoriaId;
            nomeCategoria = nomeCategoriaMapeada;
            break;
          }
        }
      }

      // Se não encontrou, usar RX como padrão
      if (!categoriaEncontrada) {
        categoriaEncontrada =
          categoriasPorNome["rx"] || categoriasPorNome["medicamento"];
        nomeCategoria = "RX";
      }

      console.log(
        `📦 [API] Produto: ${produto.descricao} → Categoria: ${nomeCategoria}`
      );

      try {
        // Atualizar produto com categoria
        await databases.updateDocument(
          DATABASE_ID,
          COLLECTION_CATALOGO,
          produto.$id,
          {
            categorias: categoriaEncontrada,
          }
        );

        resultados.push({
          produtoId: produto.$id,
          descricao: produto.descricao,
          categoria: nomeCategoria,
          sucesso: true,
        });

        console.log(
          `✅ [API] Produto ${produto.$id} atualizado com categoria ${nomeCategoria}`
        );
      } catch (updateError) {
        console.error(
          `❌ [API] Erro ao atualizar produto ${produto.$id}:`,
          updateError
        );

        resultados.push({
          produtoId: produto.$id,
          descricao: produto.descricao,
          categoria: nomeCategoria,
          sucesso: false,
          erro:
            updateError instanceof Error
              ? updateError.message
              : String(updateError),
        });
      }

      // Pequena pausa para não sobrecarregar
      await new Promise((resolve) => setTimeout(resolve, 100));
    }

    console.log("✅ [API] Processo de relacionamento concluído!");

    return NextResponse.json({
      sucesso: true,
      mensagem: "Relacionamento de categorias concluído",
      totalProdutos: produtos.length,
      resultados: resultados,
      categoriasDisponiveis: Object.keys(categoriasPorNome),
    });
  } catch (error) {
    console.error("❌ [API] Erro no relacionamento:", error);

    return NextResponse.json(
      {
        sucesso: false,
        erro: error instanceof Error ? error.message : String(error),
        mensagem: "Erro ao relacionar categorias",
      },
      { status: 500 }
    );
  }
}

export async function GET(request: NextRequest) {
  return NextResponse.json({
    mensagem: "Use POST para executar o relacionamento de categorias",
    instrucoes: [
      "1. Faça uma requisição POST para esta rota",
      "2. O sistema irá relacionar automaticamente produtos com categorias",
      "3. Após a execução, vá em /produtos para verificar",
    ],
  });
}
