import { db } from '../../config/database.js';
import { ucastnici } from '../../db/schema.js';
import { eq, sql, asc } from 'drizzle-orm';
import { NotFoundError } from '../../utils/errors.js';

export const getAllUcastnici = async () => {
  const result = await db
    .select({
      id: ucastnici.id,
      titul: ucastnici.titul,
      meno: ucastnici.meno,
      priezvisko: ucastnici.priezvisko,
      email: ucastnici.email,
      telefon: ucastnici.telefon,
      firma: ucastnici.firma,
      firmaIco: ucastnici.firmaIco,
      firmaDic: ucastnici.firmaDic,
      firmaIcDph: ucastnici.firmaIcDph,
      firmaSidlo: ucastnici.firmaSidlo,
      mesto: ucastnici.mesto,
      ulica: ucastnici.ulica,
      psc: ucastnici.psc,
      needsFollowup: ucastnici.needsFollowup,
      createdAt: ucastnici.createdAt,
      registraciiCount: sql`(SELECT COUNT(*) FROM registracie WHERE ucastnik_id = ${ucastnici.id})::int`,
    })
    .from(ucastnici)
    .orderBy(asc(ucastnici.priezvisko), asc(ucastnici.meno));

  return result;
};

export const getUcastnikById = async (id) => {
  const [ucastnik] = await db
    .select()
    .from(ucastnici)
    .where(eq(ucastnici.id, id))
    .limit(1);

  if (!ucastnik) {
    throw new NotFoundError('Účastník nenájdený');
  }

  return ucastnik;
};

export const createUcastnik = async (data) => {
  const [newUcastnik] = await db
    .insert(ucastnici)
    .values({
      titul: data.titul || null,
      meno: data.meno,
      priezvisko: data.priezvisko,
      email: data.email,
      telefon: data.telefon || null,
      firma: data.firma || null,
      firmaIco: data.firmaIco || null,
      firmaDic: data.firmaDic || null,
      firmaIcDph: data.firmaIcDph || null,
      firmaSidlo: data.firmaSidlo || null,
      mesto: data.mesto || null,
      ulica: data.ulica || null,
      psc: data.psc || null,
    })
    .returning();

  return newUcastnik;
};

export const updateUcastnik = async (id, data) => {
  await getUcastnikById(id);

  const [updated] = await db
    .update(ucastnici)
    .set({
      ...data,
      updatedAt: new Date(),
    })
    .where(eq(ucastnici.id, id))
    .returning();

  return updated;
};

export const deleteUcastnik = async (id) => {
  await getUcastnikById(id);
  await db.delete(ucastnici).where(eq(ucastnici.id, id));
  return { success: true, message: 'Účastník bol odstránený' };
};
