import type { RowDataPacket } from "mysql2";

import { db } from "@/src/lib/db";
import type { Stabilimento, Magazzino, StabilimentoWithMagazzini } from "@/src/types/stabilimento";

type StabilimentoRow = Stabilimento & RowDataPacket;
type MagazzinoRow = Magazzino & RowDataPacket;

export async function listStabilimenti(): Promise<Stabilimento[]> {
  const [rows] = await db.execute<StabilimentoRow[]>(
    "SELECT id, descrizione FROM stabilimenti ORDER BY descrizione ASC"
  );

  return rows.map((row) => ({
    id: row.id,
    descrizione: row.descrizione,
  }));
}

export async function getStabilimentoById(id: number): Promise<Stabilimento | null> {
  const [rows] = await db.execute<StabilimentoRow[]>(
    "SELECT id, descrizione FROM stabilimenti WHERE id = :id LIMIT 1",
    { id }
  );

  const row = rows[0];
  if (!row) return null;

  return {
    id: row.id,
    descrizione: row.descrizione,
  };
}

export async function listMagazzini(stabilimentoId?: number): Promise<Magazzino[]> {
  let query = `
    SELECT m.id, m.descrizione, m.id_stabilimento, s.descrizione AS stabilimento
    FROM magazzini m
    LEFT JOIN stabilimenti s ON s.id = m.id_stabilimento
  `;

  const params: Record<string, number> = {};

  if (stabilimentoId) {
    query += " WHERE m.id_stabilimento = :stabilimentoId";
    params.stabilimentoId = stabilimentoId;
  }

  query += " ORDER BY s.descrizione ASC, m.descrizione ASC";

  const [rows] = await db.execute<MagazzinoRow[]>(query, params);

  return rows.map((row) => ({
    id: row.id,
    descrizione: row.descrizione,
    id_stabilimento: row.id_stabilimento,
    stabilimento: row.stabilimento,
  }));
}

export async function getStabilimentiWithMagazzini(): Promise<StabilimentoWithMagazzini[]> {
  const stabilimenti = await listStabilimenti();
  const magazzini = await listMagazzini();

  return stabilimenti.map((stab) => ({
    ...stab,
    magazzini: magazzini.filter((mag) => mag.id_stabilimento === stab.id),
  }));
}

export async function getMagazzinoById(id: number): Promise<Magazzino | null> {
  const [rows] = await db.execute<MagazzinoRow[]>(
    `SELECT m.id, m.descrizione, m.id_stabilimento, s.descrizione AS stabilimento
     FROM magazzini m
     LEFT JOIN stabilimenti s ON s.id = m.id_stabilimento
     WHERE m.id = :id LIMIT 1`,
    { id }
  );

  const row = rows[0];
  if (!row) return null;

  return {
    id: row.id,
    descrizione: row.descrizione,
    id_stabilimento: row.id_stabilimento,
    stabilimento: row.stabilimento,
  };
}
