import { Request, Response } from 'express';
import buchungskategorieService from '../services/buchungskategorie.service';
import logger from '../utils/logger';

const param = (req: Request, key: string): string => req.params[key] as string;

class BuchungsKategorieController {
  async list(_req: Request, res: Response): Promise<void> {
    try {
      const kategorien = await buchungskategorieService.getAll();
      res.status(200).json({ success: true, data: kategorien });
    } catch (error) {
      logger.error('BuchungsKategorieController.list error', { error });
      res.status(500).json({ success: false, message: 'Buchungskategorien konnten nicht geladen werden' });
    }
  }

  async listActive(_req: Request, res: Response): Promise<void> {
    try {
      const kategorien = await buchungskategorieService.getActive();
      res.status(200).json({ success: true, data: kategorien });
    } catch (error) {
      logger.error('BuchungsKategorieController.listActive error', { error });
      res.status(500).json({ success: false, message: 'Buchungskategorien konnten nicht geladen werden' });
    }
  }

  async create(req: Request, res: Response): Promise<void> {
    const { bezeichnung } = req.body;
    if (!bezeichnung || typeof bezeichnung !== 'string' || bezeichnung.trim().length === 0) {
      res.status(400).json({ success: false, message: 'Bezeichnung ist erforderlich' });
      return;
    }
    try {
      const kategorie = await buchungskategorieService.create(req.body);
      res.status(201).json({ success: true, data: kategorie });
    } catch (error) {
      logger.error('BuchungsKategorieController.create error', { error });
      res.status(500).json({ success: false, message: 'Buchungskategorie konnte nicht erstellt werden' });
    }
  }

  async update(req: Request, res: Response): Promise<void> {
    const id = parseInt(param(req, 'id'), 10);
    if (isNaN(id)) {
      res.status(400).json({ success: false, message: 'Ungültige ID' });
      return;
    }
    try {
      const kategorie = await buchungskategorieService.update(id, req.body);
      if (!kategorie) {
        res.status(404).json({ success: false, message: 'Buchungskategorie nicht gefunden' });
        return;
      }
      res.status(200).json({ success: true, data: kategorie });
    } catch (error) {
      logger.error('BuchungsKategorieController.update error', { error });
      res.status(500).json({ success: false, message: 'Buchungskategorie konnte nicht aktualisiert werden' });
    }
  }

  async deactivate(req: Request, res: Response): Promise<void> {
    const id = parseInt(param(req, 'id'), 10);
    if (isNaN(id)) {
      res.status(400).json({ success: false, message: 'Ungültige ID' });
      return;
    }
    try {
      const kategorie = await buchungskategorieService.deactivate(id);
      if (!kategorie) {
        res.status(404).json({ success: false, message: 'Buchungskategorie nicht gefunden' });
        return;
      }
      res.status(200).json({ success: true, data: kategorie });
    } catch (error) {
      logger.error('BuchungsKategorieController.deactivate error', { error });
      res.status(500).json({ success: false, message: 'Buchungskategorie konnte nicht deaktiviert werden' });
    }
  }

  async remove(req: Request, res: Response): Promise<void> {
    const id = parseInt(param(req, 'id'), 10);
    if (isNaN(id)) {
      res.status(400).json({ success: false, message: 'Ungültige ID' });
      return;
    }
    try {
      const kategorie = await buchungskategorieService.remove(id);
      if (!kategorie) {
        res.status(404).json({ success: false, message: 'Buchungskategorie nicht gefunden' });
        return;
      }
      res.status(200).json({ success: true, data: kategorie });
    } catch (error) {
      logger.error('BuchungsKategorieController.remove error', { error });
      res.status(500).json({ success: false, message: 'Buchungskategorie konnte nicht gelöscht werden' });
    }
  }
}

export default new BuchungsKategorieController();
