import { NextResponse } from "next/server";

import { auth } from "@/src/auth";
import { listMovimenti, createMovimento } from "@/src/lib/movimenti";
import { getArticleById } from "@/src/lib/articles";
import type { TipoMovimento } from "@/src/types/movimento";

export async function GET(request: Request) {
  const session = await auth();

  if (!session?.user) {
    return NextResponse.json({ error: "Non autorizzato" }, { status: 401 });
  }

  try {
    const { searchParams } = new URL(request.url);
    const articoloId = searchParams.get("articoloId");
    const magazzinoId = searchParams.get("magazzinoId");
    const limit = searchParams.get("limit");

    const movimenti = await listMovimenti({
      articoloId: articoloId ? parseInt(articoloId, 10) : undefined,
      magazzinoId: magazzinoId ? parseInt(magazzinoId, 10) : undefined,
      limit: limit ? parseInt(limit, 10) : 100,
    });

    return NextResponse.json({ movimenti });
  } catch (error) {
    console.error("[API movimenti] Errore GET:", error);
    return NextResponse.json(
      { error: "Errore nel recupero dei movimenti" },
      { status: 500 }
    );
  }
}

export async function POST(request: Request) {
  const session = await auth();

  if (!session?.user) {
    return NextResponse.json({ error: "Non autorizzato" }, { status: 401 });
  }

  try {
    const body = await request.json();
    const { id_articolo, quantita, tipo, id_magazzino, causale } = body as {
      id_articolo: number;
      quantita: number;
      tipo: TipoMovimento;
      id_magazzino: number;
      causale?: string;
    };

    if (!id_articolo || !quantita || !tipo || !id_magazzino) {
      return NextResponse.json(
        { error: "Campi obbligatori mancanti: id_articolo, quantita, tipo, id_magazzino" },
        { status: 400 }
      );
    }

    if (quantita <= 0) {
      return NextResponse.json(
        { error: "La quantità deve essere maggiore di zero" },
        { status: 400 }
      );
    }

    if (!["carico", "scarico"].includes(tipo)) {
      return NextResponse.json(
        { error: "Tipo movimento non valido. Usare 'carico' o 'scarico'" },
        { status: 400 }
      );
    }

    const articolo = await getArticleById(id_articolo);
    if (!articolo) {
      return NextResponse.json(
        { error: "Articolo non trovato" },
        { status: 404 }
      );
    }

    const tipoMovimentoDB = tipo === "carico" ? 1 : 2;
    const utente = session.user.name || session.user.email || "Sistema";

    const movimentoId = await createMovimento({
      id_articolo,
      articolo_codice: articolo.codice,
      articolo_descrizione: articolo.descrizione,
      quantita,
      tipo_movimento: tipoMovimentoDB,
      causale: causale || null,
      utente,
      id_magazzino_origine: tipo === "scarico" ? id_magazzino : null,
      id_magazzino_destinazione: tipo === "carico" ? id_magazzino : null,
    });

    return NextResponse.json(
      { 
        message: `${tipo === "carico" ? "Carico" : "Scarico"} registrato con successo`,
        id: movimentoId 
      },
      { status: 201 }
    );
  } catch (error) {
    console.error("[API movimenti] Errore POST:", error);
    return NextResponse.json(
      { error: error instanceof Error ? error.message : "Errore nella registrazione del movimento" },
      { status: 400 }
    );
  }
}
