import { NextRequest, NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "../auth/[...nextauth]/route";
import { categoryService } from "@/lib/services/categoryService";
import { logger } from "@/lib/logger";

const MODULE = '[GET /api/categories]';

/**
 * GET /api/categories
 * Obtener todas las categorías
 */
export async function GET() {
  try {
    const session = await getServerSession(authOptions);

    if (!session || !session.user) {
      logger.warn(MODULE, 'Intento de acceso sin autenticación');
      return NextResponse.json({ error: "No autenticado" }, { status: 401 });
    }

    logger.info(MODULE, 'Obteniendo categorías');

    const categories = await categoryService.getCategories();

    logger.info(MODULE, `Categorías encontradas: ${categories.length}`);

    return NextResponse.json({ success: true, categories });
  } catch (error) {
    logger.error(
      MODULE,
      'Error al obtener categorías',
      error instanceof Error ? error : undefined
    );
    return NextResponse.json(
      { error: "Error al obtener categorías" },
      { status: 500 }
    );
  }
}

/**
 * POST /api/categories
 * Crear una nueva categoría (solo ADMIN)
 */
export async function POST(request: NextRequest) {
  const MODULE_POST = '[POST /api/categories]';
  let body: unknown;
  
  try {
    const session = await getServerSession(authOptions);

    if (!session || !session.user) {
      logger.warn(MODULE_POST, 'Intento de creación sin autenticación');
      return NextResponse.json({ error: "No autenticado" }, { status: 401 });
    }

    body = await request.json();
    const { name, description, color, icon, expenseType, paymentMethod } = body as { 
      name: string; 
      description?: string; 
      color?: string; 
      icon?: string;
      expenseType?: string;
      paymentMethod?: string;
    };

    logger.info(MODULE_POST, 'Intentando crear categoría', {
      name,
      userId: session.user.id,
      userRole: session.user.role,
    });

    if (!name || name.trim() === "") {
      logger.warn(MODULE_POST, 'Nombre de categoría vacío o inválido');
      return NextResponse.json(
        { error: "El nombre es obligatorio" },
        { status: 400 }
      );
    }

    const result = await categoryService.createCategory(
      {
        name: name.trim(),
        description: description?.trim() || undefined,
        color: color || "#3B82F6",
        icon: icon || "📄",
        expenseType: expenseType?.trim() || undefined,
        paymentMethod: paymentMethod?.trim() || undefined,
      },
      session.user.role
    );

    logger.info(MODULE_POST, 'Categoría creada exitosamente', {
      categoryId: result.id,
      name,
    });

    return NextResponse.json({ success: true, categoryId: result.id }, { status: 201 });
  } catch (error) {
    logger.error(
      MODULE_POST,
      'Error al crear categoría',
      error instanceof Error ? error : undefined,
      { name: (body as any)?.name }
    );
    const errorMessage = error instanceof Error ? error.message : "Error desconocido";
    return NextResponse.json(
      { error: errorMessage },
      { status: error instanceof Error && error.message.includes("permisos") ? 403 : 500 }
    );
  }
}
