// =============================================================================
// BuchungsKategorie (Booking Category) Service
// =============================================================================

import pool from '../config/database';
import logger from '../utils/logger';

interface CreateKategorieData {
  bezeichnung: string;
  farbe?: string;
  sort_order?: number;
}

interface UpdateKategorieData {
  bezeichnung?: string;
  farbe?: string;
  aktiv?: boolean;
  sort_order?: number;
}

async function getAll() {
  try {
    const result = await pool.query(
      `SELECT * FROM buchungs_kategorien ORDER BY sort_order, bezeichnung`
    );
    return result.rows;
  } catch (error) {
    logger.error('BuchungsKategorieService.getAll failed', { error });
    throw new Error('Buchungskategorien konnten nicht geladen werden');
  }
}

async function getActive() {
  try {
    const result = await pool.query(
      `SELECT * FROM buchungs_kategorien WHERE aktiv = TRUE ORDER BY sort_order, bezeichnung`
    );
    return result.rows;
  } catch (error) {
    logger.error('BuchungsKategorieService.getActive failed', { error });
    throw new Error('Buchungskategorien konnten nicht geladen werden');
  }
}

async function create(data: CreateKategorieData) {
  try {
    const result = await pool.query(
      `INSERT INTO buchungs_kategorien (bezeichnung, farbe, sort_order)
       VALUES ($1, $2, $3)
       RETURNING *`,
      [data.bezeichnung, data.farbe || '#607D8B', data.sort_order || 0]
    );
    return result.rows[0];
  } catch (error) {
    logger.error('BuchungsKategorieService.create failed', { error });
    throw new Error('Buchungskategorie konnte nicht erstellt werden');
  }
}

async function update(id: number, data: UpdateKategorieData) {
  try {
    const result = await pool.query(
      `UPDATE buchungs_kategorien
       SET bezeichnung = COALESCE($1, bezeichnung),
           farbe       = COALESCE($2, farbe),
           aktiv       = COALESCE($3, aktiv),
           sort_order  = COALESCE($4, sort_order)
       WHERE id = $5
       RETURNING *`,
      [data.bezeichnung, data.farbe, data.aktiv, data.sort_order, id]
    );
    return result.rows[0] || null;
  } catch (error) {
    logger.error('BuchungsKategorieService.update failed', { error, id });
    throw new Error('Buchungskategorie konnte nicht aktualisiert werden');
  }
}

async function deactivate(id: number) {
  try {
    const result = await pool.query(
      `UPDATE buchungs_kategorien SET aktiv = FALSE WHERE id = $1 RETURNING *`,
      [id]
    );
    return result.rows[0] || null;
  } catch (error) {
    logger.error('BuchungsKategorieService.deactivate failed', { error, id });
    throw new Error('Buchungskategorie konnte nicht deaktiviert werden');
  }
}

async function remove(id: number) {
  try {
    const result = await pool.query(
      `DELETE FROM buchungs_kategorien WHERE id = $1 RETURNING *`,
      [id]
    );
    return result.rows[0] || null;
  } catch (error) {
    logger.error('BuchungsKategorieService.remove failed', { error, id });
    throw new Error('Buchungskategorie konnte nicht gelöscht werden');
  }
}

export default { getAll, getActive, create, update, deactivate, remove };
