<?php
/**
 * Kalender-Einstellungen für die automatische Enddatum-Berechnung.
 *
 * - Feiertage (festivos) Barcelona: national + Katalonien + lokal.
 *   Gelten für ALLE Kurse (Erwachsene und Kinder/Jugendliche).
 * - Schulferien (Katalonien/Barcelona): gelten zusätzlich NUR für
 *   Kurse der Kategorie Kinder & Jugendliche.
 *
 * Beide Listen sind im Backend editierbar (Angebote → Kalender), da sich
 * Feiertage und der Schulkalender jedes Jahr ändern. Die Vorbefüllung
 * deckt 2026–2028 ab (bewegliche Feiertage korrekt berechnet); die
 * Schulferien-Zeiträume sind Näherungswerte nach dem üblichen Kalender
 * der Generalitat und sollten jährlich geprüft werden.
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

class AG_Calendar {

    const OPTION = 'ag_calendar_data';

    /**
     * Vorbefüllte Feiertage (YYYY-MM-DD, eine pro Zeile).
     * Quellen-Logik: nationale + katalanische + lokale Feiertage Barcelona.
     * Bewegliche Termine (Karfreitag, Ostermontag, Pfingstmontag/Segona
     * Pasqua) sind für 2026–2028 fest eingetragen.
     */
    public static function default_holidays() {
        return array(
            // 2026
            '2026-01-01', // Año Nuevo
            '2026-01-06', // Reyes
            '2026-04-03', // Viernes Santo
            '2026-04-06', // Lunes de Pascua (Cat.)
            '2026-05-01', // Fiesta del Trabajo
            '2026-05-25', // Segona Pasqua / Pentecostés (local BCN)
            '2026-06-24', // Sant Joan
            '2026-08-15', // Asunción
            '2026-09-11', // Diada de Catalunya
            '2026-09-24', // La Mercè (local BCN)
            '2026-10-12', // Fiesta Nacional
            '2026-11-01', // Todos los Santos
            '2026-12-06', // Constitución
            '2026-12-08', // Inmaculada
            '2026-12-25', // Navidad
            '2026-12-26', // Sant Esteve (Cat.)
            // 2027
            '2027-01-01',
            '2027-01-06',
            '2027-03-26', // Viernes Santo
            '2027-03-29', // Lunes de Pascua
            '2027-05-01',
            '2027-05-17', // Segona Pasqua (local BCN)
            '2027-06-24',
            '2027-08-15',
            '2027-09-11',
            '2027-09-24',
            '2027-10-12',
            '2027-11-01',
            '2027-12-06',
            '2027-12-08',
            '2027-12-25',
            '2027-12-26',
            // 2028
            '2028-01-01',
            '2028-01-06',
            '2028-04-14', // Viernes Santo
            '2028-04-17', // Lunes de Pascua
            '2028-05-01',
            '2028-06-05', // Segona Pasqua (local BCN)
            '2028-06-24',
            '2028-08-15',
            '2028-09-11',
            '2028-09-24',
            '2028-10-12',
            '2028-11-01',
            '2028-12-06',
            '2028-12-08',
            '2028-12-25',
            '2028-12-26',
        );
    }

    /**
     * Vorbefüllte Schulferien-Zeiträume (Katalonien, Näherung).
     * Format je Zeile: "YYYY-MM-DD - YYYY-MM-DD" (von – bis, inklusive).
     */
    public static function default_school_ranges() {
        return array(
            '2026-06-20 - 2026-09-13', // Sommer 2026 (Näherung)
            '2026-12-22 - 2027-01-07', // Weihnachten 2026/27
            '2027-03-20 - 2027-03-29', // Setmana Santa 2027 (Näherung)
            '2027-06-22 - 2027-09-12', // Sommer 2027 (Näherung)
            '2027-12-22 - 2028-01-07', // Weihnachten 2027/28
            '2028-04-08 - 2028-04-17', // Setmana Santa 2028 (Näherung)
        );
    }

    /**
     * Liefert die gespeicherten Kalenderdaten (mit Fallback auf Defaults).
     *
     * @return array{holidays:string[], school_ranges:array<int,array{0:string,1:string}>}
     */
    public static function get() {
        $saved = get_option( self::OPTION, array() );
        if ( ! is_array( $saved ) ) {
            $saved = array();
        }

        $holidays_raw = isset( $saved['holidays'] ) && '' !== trim( (string) $saved['holidays'] )
            ? (string) $saved['holidays']
            : implode( "\n", self::default_holidays() );

        $ranges_raw = isset( $saved['school_ranges'] ) && '' !== trim( (string) $saved['school_ranges'] )
            ? (string) $saved['school_ranges']
            : implode( "\n", self::default_school_ranges() );

        return array(
            'holidays'      => self::parse_dates( $holidays_raw ),
            'school_ranges' => self::parse_ranges( $ranges_raw ),
            'holidays_raw'  => $holidays_raw,
            'ranges_raw'    => $ranges_raw,
        );
    }

    /**
     * Zeilenweise Datumsliste parsen (akzeptiert YYYY-MM-DD und DD.MM.YYYY).
     *
     * @return string[] Y-m-d
     */
    public static function parse_dates( $raw ) {
        $out = array();
        foreach ( preg_split( '/[\r\n]+/', (string) $raw ) as $line ) {
            $d = self::normalize_date( $line );
            if ( $d ) {
                $out[] = $d;
            }
        }
        sort( $out );
        return array_values( array_unique( $out ) );
    }

    /**
     * Zeilenweise Zeiträume "von - bis" parsen.
     *
     * @return array<int,array{0:string,1:string}>
     */
    public static function parse_ranges( $raw ) {
        $out = array();
        foreach ( preg_split( '/[\r\n]+/', (string) $raw ) as $line ) {
            if ( preg_match( '/^\s*([0-9.\-\/]+)\s*[-–—]\s*([0-9.\-\/]+)\s*(?:#.*)?$/u', $line, $m ) ) {
                $from = self::normalize_date( $m[1] );
                $to   = self::normalize_date( $m[2] );
                if ( $from && $to && $from <= $to ) {
                    $out[] = array( $from, $to );
                }
            }
        }
        return $out;
    }

    /**
     * Einzelnes Datum normalisieren (Kommentare nach # erlaubt).
     */
    private static function normalize_date( $s ) {
        $s = trim( preg_replace( '/#.*$/', '', (string) $s ) );
        if ( '' === $s ) {
            return null;
        }
        if ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})$/', $s, $m ) ) {
            return $m[1] . '-' . $m[2] . '-' . $m[3];
        }
        if ( preg_match( '/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/', $s, $m ) ) {
            return sprintf( '%04d-%02d-%02d', $m[3], $m[2], $m[1] );
        }
        return null;
    }

    public static function init() {
        add_action( 'admin_init', array( __CLASS__, 'maybe_save' ) );
    }

    public static function maybe_save() {
        if ( empty( $_POST['ag_calendar_nonce'] ) || ! wp_verify_nonce( $_POST['ag_calendar_nonce'], 'ag_save_calendar' ) ) {
            return;
        }
        if ( ! current_user_can( 'manage_options' ) ) {
            return;
        }

        $data = array(
            'holidays'      => sanitize_textarea_field( wp_unslash( $_POST['ag_cal']['holidays'] ?? '' ) ),
            'school_ranges' => sanitize_textarea_field( wp_unslash( $_POST['ag_cal']['school_ranges'] ?? '' ) ),
        );
        update_option( self::OPTION, $data );

        add_action( 'admin_notices', function () {
            echo '<div class="notice notice-success is-dismissible"><p>Kalender gespeichert.</p></div>';
        } );
    }

    /**
     * Einstellungsseite "Kalender".
     */
    public static function render_page() {
        if ( ! current_user_can( 'manage_options' ) ) {
            wp_die( 'Keine Berechtigung.' );
        }
        $cal = self::get();
        ?>
        <div class="wrap">
            <h1>Kalender (Feiertage &amp; Schulferien)</h1>
            <p>Diese Daten werden für die automatische Berechnung des Enddatums in den Angeboten verwendet:
               <strong>Feiertage</strong> gelten für alle Kurse, die <strong>Schulferien</strong> zusätzlich nur für
               Kurse der Kategorie „Kinder &amp; Jugendliche“. Bitte jährlich prüfen und ergänzen.</p>
            <form method="post">
                <?php wp_nonce_field( 'ag_save_calendar', 'ag_calendar_nonce' ); ?>
                <table class="form-table">
                    <tr>
                        <th><label for="ag_cal_holidays">Feiertage Barcelona</label></th>
                        <td>
                            <textarea id="ag_cal_holidays" name="ag_cal[holidays]" rows="18" cols="40" style="font-family:monospace;"><?php echo esc_textarea( $cal['holidays_raw'] ); ?></textarea>
                            <p class="description">Ein Datum pro Zeile, Format JJJJ-MM-TT oder TT.MM.JJJJ. Kommentare nach „#“ sind erlaubt.</p>
                        </td>
                    </tr>
                    <tr>
                        <th><label for="ag_cal_ranges">Schulferien (Zeiträume)</label></th>
                        <td>
                            <textarea id="ag_cal_ranges" name="ag_cal[school_ranges]" rows="10" cols="40" style="font-family:monospace;"><?php echo esc_textarea( $cal['ranges_raw'] ); ?></textarea>
                            <p class="description">Ein Zeitraum pro Zeile: „JJJJ-MM-TT - JJJJ-MM-TT“ (von – bis, einschließlich). Gilt nur für Kinder- &amp; Jugendkurse.</p>
                        </td>
                    </tr>
                </table>
                <p class="submit"><button type="submit" class="button button-primary">Speichern</button></p>
            </form>
        </div>
        <?php
    }
}
