import { NextRequest, NextResponse } from "next/server";
import { Client, Databases, Query } from "appwrite";
import { UserRole } from "@/types/auth";

export const runtime = "edge";

// Função para obter cliente Appwrite do servidor
function 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 usuários com filtro por empresa para admins
export async function GET(request: NextRequest) {
  try {
    const { searchParams } = new URL(request.url);
    const userRole = searchParams.get("userRole");
    const empresaId = searchParams.get("empresaId");

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

    let queries = [];

    // Se for admin (não superadmin), filtrar apenas usuários da mesma empresa
    if (userRole === UserRole.ADMIN && empresaId) {
      queries.push(Query.contains("empresas_array", empresaId));
    }

    // Não mostrar superadmins para admins comuns
    if (userRole === UserRole.ADMIN) {
      queries.push(Query.notEqual("nivel", UserRole.SUPERADMIN));
    }

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

    return NextResponse.json({
      success: true,
      data: response.documents,
      total: response.total,
    });
  } catch (error: any) {
    console.error("Erro ao listar usuários:", error);
    return NextResponse.json(
      { success: false, error: "Erro ao carregar usuários" },
      { status: 500 }
    );
  }
}

// POST - Criar novo usuário (apenas admins e superadmins)
export async function POST(request: NextRequest) {
  try {
    const body = await request.json();
    const {
      nome,
      email,
      senha,
      cpf,
      nivel,
      empresaId,
      userRole, // Role do usuário que está criando
    } = body;

    // Validações
    if (!nome || !email || !senha || !cpf || !nivel) {
      return NextResponse.json(
        { success: false, error: "Todos os campos são obrigatórios" },
        { status: 400 }
      );
    }

    // Verificar permissões
    if (userRole !== UserRole.SUPERADMIN && userRole !== UserRole.ADMIN) {
      return NextResponse.json(
        { success: false, error: "Permissão insuficiente" },
        { status: 403 }
      );
    }

    // Admin só pode criar colaboradores e entregadores
    if (
      userRole === UserRole.ADMIN &&
      ![UserRole.COLABORADOR, UserRole.ENTREGADOR].includes(nivel)
    ) {
      return NextResponse.json(
        {
          success: false,
          error: "Admins só podem criar colaboradores e entregadores",
        },
        { status: 403 }
      );
    }

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

    // Verificar se já existe usuário com este email
    const existingUsers = await databases.listDocuments(
      databaseId,
      collectionId,
      [Query.equal("email", email)]
    );

    if (existingUsers.documents.length > 0) {
      return NextResponse.json(
        { success: false, error: "Já existe um usuário com este email" },
        { status: 400 }
      );
    }

    // Criar conta no Appwrite Auth (isso precisaria ser feito via SDK de servidor)
    // Por enquanto, vamos simular a criação retornando um ID único
    const authId = `user_${Date.now()}_${Math.random()
      .toString(36)
      .substr(2, 9)}`;

    // Preparar dados do usuário
    const usuarioData = {
      "nome-civil": nome,
      cpf: cpf,
      "auth-id-appwrite": authId,
      email: email,
      nivel: nivel,
      enderecos: [],
      empresas_array: userRole === UserRole.ADMIN ? [empresaId] : [],
    };

    // Criar documento do usuário
    const response = await databases.createDocument(
      databaseId,
      collectionId,
      "unique()",
      usuarioData
    );

    return NextResponse.json({
      success: true,
      data: response,
      message: "Usuário criado com sucesso",
    });
  } catch (error: any) {
    console.error("Erro ao criar usuário:", error);
    return NextResponse.json(
      { success: false, error: "Erro interno do servidor" },
      { status: 500 }
    );
  }
}
