const { LiturgicalDay } = require('../models');
const { Op } = require('sequelize');
const axios = require('axios');

// Alle liturgischen Tage abrufen
const getAllLiturgicalDays = async (req, res) => {
  try {
    const days = await LiturgicalDay.findAll({
      order: [['date', 'ASC']]
    });
    res.status(200).json(days);
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: 'Fehler beim Abrufen der liturgischen Tage' });
  }
};

// Eindeutige Namen für Multiselect abrufen
const getLiturgicalDayNames = async (req, res) => {
  try {
    const days = await LiturgicalDay.findAll({
      attributes: ['dayName'],
      group: ['dayName'],
      order: [['dayName', 'ASC']]
    });
    const names = days.map(day => day.dayName);
    res.status(200).json(names);
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: 'Fehler beim Abrufen der Tag-Namen' });
  }
};

// HTML von liturgischem Kalender parsen und in DB speichern
const loadLiturgicalYear = async (req, res) => {
  const { year } = req.body;
  
  if (!year) {
    return res.status(400).json({ message: 'Jahr ist erforderlich' });
  }

  const currentYear = new Date().getFullYear();
  if (year < currentYear || year > currentYear + 2) {
    return res.status(400).json({ message: 'Jahr muss zwischen aktuellem Jahr und 2 Jahren in der Zukunft liegen' });
  }

  try {
    const url = `https://www.eike-fleer.de/liturgischer-kalender/${year}.htm`;
    const response = await axios.get(url, {
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
      }
    });

    const html = response.data;
    
    // Parse HTML - suche nach Tabellenzeilen mit Datum und Name
    // Format: "DD.MM.YYYY &nbsp; &nbsp; &nbsp; DayName"
    const regex = /(\d{2}\.\d{2}\.\d{4})\s*(?:&nbsp;|\s)+(.+?)(?:<\/|$)/gi;
    const matches = [...html.matchAll(regex)];
    
    const liturgicalDays = [];
    
    for (const match of matches) {
      const dateStr = match[1]; // DD.MM.YYYY
      let dayName = match[2];
      
      // Bereinige den Tag-Namen von HTML-Tags und Entities
      dayName = dayName
        .replace(/<[^>]*>/g, '') // Entferne HTML-Tags
        .replace(/&nbsp;/g, ' ') // Ersetze &nbsp;
        .replace(/&auml;/g, 'ä')
        .replace(/&ouml;/g, 'ö')
        .replace(/&uuml;/g, 'ü')
        .replace(/&Auml;/g, 'Ä')
        .replace(/&Ouml;/g, 'Ö')
        .replace(/&Uuml;/g, 'Ü')
        .replace(/&szlig;/g, 'ß')
        .trim();
      
      // Konvertiere Datum von DD.MM.YYYY zu YYYY-MM-DD
      const [day, month, yearPart] = dateStr.split('.');
      const isoDate = `${yearPart}-${month}-${day}`;
      
      if (dayName && dayName.length > 0) {
        liturgicalDays.push({
          date: isoDate,
          dayName: dayName
        });
      }
    }

    if (liturgicalDays.length === 0) {
      return res.status(500).json({ message: 'Keine liturgischen Tage gefunden. Möglicherweise hat sich das HTML-Format geändert.' });
    }

    // Speichere oder aktualisiere die Einträge
    for (const day of liturgicalDays) {
      await LiturgicalDay.upsert({
        date: day.date,
        dayName: day.dayName
      });
    }

    res.status(200).json({ 
      message: `${liturgicalDays.length} liturgische Tage für ${year} erfolgreich geladen`,
      count: liturgicalDays.length 
    });
  } catch (error) {
    console.error('Fehler beim Laden der liturgischen Tage:', error);
    if (error.response && error.response.status === 404) {
      return res.status(404).json({ message: `Liturgischer Kalender für ${year} nicht gefunden` });
    }
    res.status(500).json({ message: 'Fehler beim Laden der liturgischen Tage', error: error.message });
  }
};

// Einzelnen Tag erstellen
const createLiturgicalDay = async (req, res) => {
  try {
    const day = await LiturgicalDay.create(req.body);
    res.status(201).json(day);
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: 'Fehler beim Erstellen des liturgischen Tags' });
  }
};

// Tag löschen
const deleteLiturgicalDay = async (req, res) => {
  try {
    const { id } = req.params;
    const deleted = await LiturgicalDay.destroy({
      where: { id }
    });
    if (deleted) {
      res.status(200).json({ message: 'Liturgischer Tag erfolgreich gelöscht' });
    } else {
      res.status(404).json({ message: 'Liturgischer Tag nicht gefunden' });
    }
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: 'Fehler beim Löschen des liturgischen Tags' });
  }
};

module.exports = {
  getAllLiturgicalDays,
  getLiturgicalDayNames,
  loadLiturgicalYear,
  createLiturgicalDay,
  deleteLiturgicalDay
};

