<?php
/**
 * Gemeinsame Eingabemaske + Verarbeitung für Front- und Backend.
 *
 * - rendert das Angebotsformular (Kundendaten, Positionen, Zahlungsart)
 * - verarbeitet das Absenden: speichert das Angebot und erzeugt das PDF
 * - stellt die Nummernlogik (YY_0000, automatisch + überschreibbar) bereit
 */

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

class AG_Form {

    const NONCE_ACTION = 'ag_offer_form';
    const CAP          = 'edit_posts'; // Admin + Redakteur/Mitarbeiter

    /**
     * Prüft, ob die/der aktuelle Nutzer:in das Tool verwenden darf.
     */
    public static function current_user_can_use() {
        return is_user_logged_in() && current_user_can( self::CAP );
    }

    /**
     * Verarbeitet ein abgesendetes Formular.
     *
     * Rückgabe:
     *  - bei "PDF erstellen": beendet die Ausführung (Download) und kehrt nicht zurück
     *  - sonst: array mit Status/Meldung für die Anzeige
     *
     * @return array{status:string, message:string, offer_id:int, offer:array}|null
     */
    public static function handle_submit() {
        if ( empty( $_POST['ag_nonce'] ) || ! wp_verify_nonce( $_POST['ag_nonce'], self::NONCE_ACTION ) ) {
            return null;
        }
        if ( ! self::current_user_can_use() ) {
            return array( 'status' => 'error', 'message' => 'Keine Berechtigung.', 'offer_id' => 0, 'offer' => array() );
        }

        $raw   = isset( $_POST['ag'] ) && is_array( $_POST['ag'] ) ? wp_unslash( $_POST['ag'] ) : array();
        $offer = AG_Offer::sanitize( $raw );

        $offer_id = isset( $_POST['ag_offer_id'] ) ? (int) $_POST['ag_offer_id'] : 0;

        // Nummer bestimmen: manuell übernommen oder automatisch vergeben.
        if ( '' === trim( $offer['number'] ) ) {
            $next           = AG_DB::next_number();
            $offer['number'] = $next['number'];
        }

        // Datum-Fallback: heute
        if ( '' === $offer['offer_date'] ) {
            $offer['offer_date'] = current_time( 'Y-m-d' );
        }

        // Doppelte Nummer verhindern (außer beim selben Datensatz).
        if ( AG_DB::number_exists( $offer['number'], $offer_id ) ) {
            return array(
                'status'   => 'error',
                'message'  => 'Die Nummer "' . esc_html( $offer['number'] ) . '" ist bereits vergeben. Bitte eine andere Nummer verwenden.',
                'offer_id' => $offer_id,
                'offer'    => $offer,
            );
        }

        $action = isset( $_POST['ag_action'] ) ? sanitize_key( $_POST['ag_action'] ) : 'save';

        // Speichern (bei "save" und "pdf")
        $offer_id = AG_DB::save( $offer, $offer['number'], $offer['offer_date'], $offer_id ?: null );

        if ( 'pdf' === $action ) {
            $filename = AG_Offer::build_filename( $offer );
            AG_PDF::stream( $offer, $filename ); // beendet die Ausführung
        }

        return array(
            'status'   => 'success',
            'message'  => 'Angebot ' . esc_html( $offer['number'] ) . ' wurde gespeichert.',
            'offer_id' => $offer_id,
            'offer'    => $offer,
        );
    }

    /**
     * Rendert das Eingabeformular.
     *
     * @param array $offer    Vorbelegung (z. B. beim Bearbeiten).
     * @param int   $offer_id
     * @param array $notice   optionales ['status'=>..,'message'=>..]
     */
    public static function render_form( array $offer = array(), $offer_id = 0, $notice = null ) {
        // Standardwerte
        $defaults = array(
            'number'      => '',
            'offer_date'  => current_time( 'Y-m-d' ),
            'client_name' => '',
            'first_name'  => '',
            'last_name'   => '',
            'dni'         => '',
            'address'     => '',
            'language'    => 'DE',
            'volume'      => '',
            'unit'        => 'hl',
            'doc_language' => 'ES',
            'intro'       => '',
            'items'       => array(),
            'discount'    => 0,
            'payment'     => 'full',
            'notes'       => '',
        );
        $offer = wp_parse_args( $offer, $defaults );

        // Vorschlagsnummer, falls neu
        $suggested_number = '' !== $offer['number'] ? $offer['number'] : AG_DB::next_number()['number'];

        // Mindestens 3 leere Positionszeilen anbieten
        $items = $offer['items'];
        while ( count( $items ) < 3 ) {
            $items[] = array( 'qty' => '1', 'concept' => '', 'price' => '', 'units' => '', 'amount' => '' );
        }

        wp_enqueue_style( 'ag-style' );
        wp_enqueue_script( 'ag-script' );

        ob_start();
        ?>
        <div class="ag-wrap">
            <h2 class="ag-title">Angebot (Presupuesto) erstellen</h2>

            <?php if ( $notice ) : ?>
                <div class="ag-notice ag-notice-<?php echo esc_attr( $notice['status'] ); ?>">
                    <?php echo wp_kses_post( $notice['message'] ); ?>
                </div>
            <?php endif; ?>

            <form method="post" class="ag-form">
                <?php wp_nonce_field( self::NONCE_ACTION, 'ag_nonce' ); ?>
                <input type="hidden" name="ag_offer_id" value="<?php echo esc_attr( $offer_id ); ?>">

                <div class="ag-grid">
                    <div class="ag-field">
                        <label>Nummer (YY_0000)</label>
                        <input type="text" name="ag[number]" value="<?php echo esc_attr( $suggested_number ); ?>">
                        <small>Automatisch vergeben, kann überschrieben werden.</small>
                    </div>
                    <div class="ag-field">
                        <label>Datum</label>
                        <input type="date" name="ag[offer_date]" value="<?php echo esc_attr( $offer['offer_date'] ); ?>">
                    </div>
                    <div class="ag-field">
                        <label>Sprache des Angebots (Dokument)</label>
                        <select name="ag[doc_language]" id="ag-doc-language">
                            <?php foreach ( AG_I18n::DOC_LANGUAGES as $code => $label ) : ?>
                                <option value="<?php echo esc_attr( $code ); ?>" <?php selected( $offer['doc_language'], $code ); ?>>
                                    <?php echo esc_html( $label ); ?>
                                </option>
                            <?php endforeach; ?>
                        </select>
                        <small>Alle festen Texte im PDF erscheinen in dieser Sprache.</small>
                    </div>
                </div>

                <fieldset class="ag-fieldset">
                    <legend>Kunde</legend>
                    <div class="ag-grid">
                        <div class="ag-field">
                            <label>Vorname</label>
                            <input type="text" name="ag[first_name]" value="<?php echo esc_attr( $offer['first_name'] ); ?>">
                        </div>
                        <div class="ag-field">
                            <label>Nachname</label>
                            <input type="text" name="ag[last_name]" value="<?php echo esc_attr( $offer['last_name'] ); ?>">
                        </div>
                    </div>
                    <div class="ag-grid">
                        <div class="ag-field">
                            <label>DNI / NIF / NIE</label>
                            <input type="text" name="ag[dni]" value="<?php echo esc_attr( $offer['dni'] ); ?>">
                        </div>
                        <div class="ag-field">
                            <label>Adresse (Calle, Nº, CP, Ciudad)</label>
                            <input type="text" name="ag[address]" value="<?php echo esc_attr( $offer['address'] ); ?>">
                        </div>
                    </div>
                </fieldset>

                <fieldset class="ag-fieldset">
                    <legend>Angaben für Dateiname</legend>
                    <div class="ag-grid ag-grid-3">
                        <div class="ag-field">
                            <label>Sprache</label>
                            <select name="ag[language]">
                                <?php foreach ( AG_Offer::LANGUAGES as $code => $label ) : ?>
                                    <option value="<?php echo esc_attr( $code ); ?>" <?php selected( $offer['language'], $code ); ?>>
                                        <?php echo esc_html( $code . ' – ' . $label ); ?>
                                    </option>
                                <?php endforeach; ?>
                            </select>
                        </div>
                        <div class="ag-field">
                            <label>Volumen (z. B. 36h, 210UE)</label>
                            <input type="text" name="ag[volume]" value="<?php echo esc_attr( $offer['volume'] ); ?>">
                            <small>Nur für den Dateinamen. Leer lassen = wird automatisch aus den Positionen (Einheiten) übernommen.</small>
                        </div>
                        <div class="ag-field">
                            <label>Einheit</label>
                            <select name="ag[unit]">
                                <?php foreach ( AG_Offer::UNITS as $code => $label ) : ?>
                                    <option value="<?php echo esc_attr( $code ); ?>" <?php selected( $offer['unit'], $code ); ?>>
                                        <?php echo esc_html( $label ); ?>
                                    </option>
                                <?php endforeach; ?>
                            </select>
                        </div>
                    </div>
                </fieldset>

                <fieldset class="ag-fieldset">
                    <legend>Einleitungstext (optional anpassbar)</legend>
                    <textarea name="ag[intro]" rows="2" class="ag-textarea" placeholder="Standardtext wird verwendet, wenn leer."><?php echo esc_textarea( $offer['intro'] ); ?></textarea>
                </fieldset>

                <fieldset class="ag-fieldset">
                    <legend>Positionen</legend>
                    <p class="ag-hint">Wähle eine Kursart, um den Preis pro Einheit automatisch aus der Preisliste zu übernehmen (passend zur gewählten Einheit h/hl). Alle Felder bleiben frei überschreibbar. Der Concepto-Satz wird aus den Bausteinen automatisch in der gewählten Dokumentsprache erzeugt – oder du überschreibst ihn manuell im Textfeld.</p>

                    <div id="ag-items">
                        <?php foreach ( $items as $i => $item ) :
                            $parts = isset( $item['concept_parts'] ) && is_array( $item['concept_parts'] ) ? $item['concept_parts'] : array();
                            $p = wp_parse_args( $parts, array( 'taught' => $offer['language'], 'motivo' => '', 'sessions' => '', 'duration' => '', 'from' => '', 'to' => '', 'modality' => '', 'weekdays' => array() ) );
                            // from/to im Formular als Y-m-d (input date); gespeichert ist DD.MM.YYYY → zurückrechnen
                            $from_ymd = self::to_input_date( $p['from'] );
                            $to_ymd   = self::to_input_date( $p['to'] );
                            $manual   = isset( $item['concept_manual'] ) ? $item['concept_manual'] : ( isset( $item['concept'] ) ? $item['concept'] : '' );
                            ?>
                            <div class="ag-item-row">
                                <div class="ag-item-head">
                                    <span class="ag-item-nr">Position <?php echo (int) $i + 1; ?></span>
                                    <button type="button" class="ag-remove" title="Position entfernen">&times; entfernen</button>
                                </div>

                                <div class="ag-grid ag-grid-4">
                                    <div class="ag-field">
                                        <label>Kursart (Vorlage)</label>
                                        <select class="ag-course" name="ag[items][<?php echo $i; ?>][course]">
                                            <option value="">– frei –</option>
                                            <?php $item_course = isset( $item['course'] ) ? $item['course'] : '';
                                            foreach ( AG_Offer::price_catalog() as $key => $c ) : ?>
                                                <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $item_course, $key ); ?>><?php echo esc_html( $c['label'] ); ?></option>
                                            <?php endforeach; ?>
                                        </select>
                                    </div>
                                    <div class="ag-field">
                                        <label>Cantidad</label>
                                        <input type="text" name="ag[items][<?php echo $i; ?>][qty]" value="<?php echo esc_attr( $item['qty'] ); ?>" class="ag-qty">
                                        <small>Menge des Postens – i. d. R. <strong>1</strong> (z. B. 1 Kurs).</small>
                                    </div>
                                    <div class="ag-field">
                                        <label>Precio / unidad</label>
                                        <input type="text" name="ag[items][<?php echo $i; ?>][price]" value="<?php echo esc_attr( $item['price'] ); ?>" class="ag-price">
                                        <small>Preis pro Einheit (h/hl).</small>
                                    </div>
                                    <div class="ag-field">
                                        <label>Unidades</label>
                                        <input type="text" name="ag[items][<?php echo $i; ?>][units]" value="<?php echo esc_attr( $item['units'] ); ?>" class="ag-units">
                                        <small>Anzahl der Einheiten (h/hl), z. B. <strong>40</strong>.</small>
                                    </div>
                                </div>

                                <div class="ag-concept-builder">
                                    <div class="ag-concept-title">Concepto – Bausteine</div>
                                    <div class="ag-grid ag-grid-4">
                                        <div class="ag-field">
                                            <label>Idioma (Sprache)</label>
                                            <select name="ag[items][<?php echo $i; ?>][c_taught]" class="ag-c-taught">
                                                <?php foreach ( AG_Offer::LANGUAGES as $code => $label ) : ?>
                                                    <option value="<?php echo esc_attr( $code ); ?>" <?php selected( $p['taught'], $code ); ?>><?php echo esc_html( $code ); ?></option>
                                                <?php endforeach; ?>
                                            </select>
                                        </div>
                                        <div class="ag-field">
                                            <label>Motivo</label>
                                            <input type="text" name="ag[items][<?php echo $i; ?>][c_motivo]" value="<?php echo esc_attr( $p['motivo'] ); ?>" class="ag-c-motivo" placeholder="conversación / examen / repaso">
                                        </div>
                                        <div class="ag-field">
                                            <label>Sesiones / semana</label>
                                            <input type="text" name="ag[items][<?php echo $i; ?>][c_sessions]" value="<?php echo esc_attr( $p['sessions'] ); ?>" class="ag-c-sessions" placeholder="1">
                                        </div>
                                        <div class="ag-field">
                                            <label>Duración / sesión</label>
                                            <input type="text" name="ag[items][<?php echo $i; ?>][c_duration]" value="<?php echo esc_attr( $p['duration'] ); ?>" class="ag-c-duration" placeholder="1,5">
                                        </div>
                                    </div>
                                    <div class="ag-grid ag-grid-3">
                                        <div class="ag-field">
                                            <label>Del (Beginn)</label>
                                            <input type="date" name="ag[items][<?php echo $i; ?>][c_from]" value="<?php echo esc_attr( $from_ymd ); ?>" class="ag-c-from">
                                        </div>
                                        <div class="ag-field">
                                            <label>Al (Ende)</label>
                                            <input type="date" name="ag[items][<?php echo $i; ?>][c_to]" value="<?php echo esc_attr( $to_ymd ); ?>" class="ag-c-to">
                                            <small>Wird bei „Enddatum berechnen“ automatisch gesetzt.</small>
                                        </div>
                                        <div class="ag-field">
                                            <label>Modalidad</label>
                                            <select name="ag[items][<?php echo $i; ?>][c_modality]" class="ag-c-modality">
                                                <option value="">–</option>
                                                <option value="presencial" <?php selected( $p['modality'], 'presencial' ); ?>>presencial</option>
                                                <option value="domicilio" <?php selected( $p['modality'], 'domicilio' ); ?>>a domicilio</option>
                                                <option value="online" <?php selected( $p['modality'], 'online' ); ?>>online</option>
                                            </select>
                                        </div>
                                    </div>

                                    <div class="ag-cal-box">
                                        <div class="ag-cal-title">Enddatum automatisch berechnen</div>
                                        <div class="ag-grid ag-grid-3">
                                            <div class="ag-field">
                                                <label>Unterrichtstage (Wochentage)</label>
                                                <div class="ag-weekdays">
                                                    <?php
                                                    $wd = array( 1 => 'Mo', 2 => 'Di', 3 => 'Mi', 4 => 'Do', 5 => 'Fr', 6 => 'Sa', 0 => 'So' );
                                                    $sel_wd = isset( $p['weekdays'] ) && is_array( $p['weekdays'] ) ? array_map( 'intval', $p['weekdays'] ) : array();
                                                    foreach ( $wd as $num => $lbl ) : ?>
                                                        <label class="ag-wd"><input type="checkbox" class="ag-c-weekday" name="ag[items][<?php echo $i; ?>][c_weekdays][]" value="<?php echo (int) $num; ?>" <?php echo in_array( (int) $num, $sel_wd, true ) ? 'checked' : ''; ?>> <?php echo esc_html( $lbl ); ?></label>
                                                    <?php endforeach; ?>
                                                </div>
                                                <small>Erscheinen im Angebotstext (z. B. „los martes y jueves“).</small>
                                            </div>
                                            <div class="ag-field">
                                                <label>Kalender</label>
                                                <select class="ag-c-calendar">
                                                    <option value="adults">Erwachsene (nur Feiertage BCN)</option>
                                                    <option value="kids">Kinder &amp; Jugendliche (Feiertage + Schulferien)</option>
                                                </select>
                                                <small>Wird bei Auswahl einer Kursart automatisch gesetzt.</small>
                                            </div>
                                            <div class="ag-field">
                                                <label>&nbsp;</label>
                                                <div class="ag-cal-buttons">
                                                    <button type="button" class="ag-btn ag-btn-light ag-c-compute">Enddatum berechnen</button>
                                                    <button type="button" class="ag-btn ag-btn-light ag-c-compute-units">Unidades berechnen</button>
                                                </div>
                                                <small>Enddatum: aus Unidades. Unidades: aus Start-/Enddatum.</small>
                                            </div>
                                        </div>
                                        <div class="ag-cal-result" style="display:none;"></div>
                                    </div>
                                    <div class="ag-field">
                                        <label>Concepto (manuell – überschreibt die Bausteine, wenn ausgefüllt)</label>
                                        <textarea name="ag[items][<?php echo $i; ?>][concept]" rows="2" class="ag-concept" placeholder="Leer lassen, um den Satz automatisch aus den Bausteinen zu erzeugen."><?php echo esc_textarea( $manual ); ?></textarea>
                                        <div class="ag-concept-preview">Vorschau: <span class="ag-concept-preview-text">–</span></div>
                                    </div>
                                </div>

                                <div class="ag-item-amount">Importe: <input type="text" class="ag-amount" value="<?php echo esc_attr( '' !== $item['amount'] ? AG_Offer::format_money( $item['amount'], false ) : '' ); ?>" readonly> EUR <span class="ag-row-disc"></span></div>
                            </div>
                        <?php endforeach; ?>
                    </div>

                    <p><button type="button" class="ag-btn ag-btn-light" id="ag-add-row">+ Position hinzufügen</button></p>

                    <script type="application/json" id="ag-price-catalog"><?php echo wp_json_encode( AG_Offer::price_catalog() ); ?></script>
                    <script type="application/json" id="ag-i18n-data"><?php echo wp_json_encode( self::js_i18n() ); ?></script>
                    <?php $ag_cal = AG_Calendar::get(); ?>
                    <script type="application/json" id="ag-calendar-data"><?php echo wp_json_encode( array( 'holidays' => $ag_cal['holidays'], 'school_ranges' => $ag_cal['school_ranges'] ) ); ?></script>

                    <div class="ag-grid">
                        <div class="ag-field">
                            <label>Rabatt / Descuento (EUR)</label>
                            <input type="text" name="ag[discount]" value="<?php echo esc_attr( $offer['discount'] ); ?>" class="ag-discount">
                            <small>Wird automatisch aus der Mengenrabatt-Staffel (je Kursart, Einheit &amp; Volumen) berechnet – kann überschrieben werden. Feld leeren = automatische Berechnung.</small>
                        </div>
                        <div class="ag-field ag-totals-preview">
                            <div>Zwischensumme: <strong id="ag-sum">–</strong></div>
                            <div>Gesamt (nach Rabatt): <strong id="ag-total">–</strong></div>
                        </div>
                    </div>
                </fieldset>

                <fieldset class="ag-fieldset">
                    <legend>Zahlungsart</legend>
                    <p class="ag-hint">Im PDF werden <strong>beide Zahlungsoptionen</strong> mit leerem Ankreuzkästchen angezeigt – die Kundin/der Kunde wählt selbst aus. Hier ist keine Eingabe nötig.</p>
                </fieldset>

                <fieldset class="ag-fieldset">
                    <legend>Zusätzliche Bemerkungen (optional)</legend>
                    <textarea name="ag[notes]" rows="2" class="ag-textarea"><?php echo esc_textarea( $offer['notes'] ); ?></textarea>
                </fieldset>

                <div class="ag-actions">
                    <button type="submit" name="ag_action" value="pdf" class="ag-btn ag-btn-primary">PDF erstellen &amp; herunterladen</button>
                    <button type="submit" name="ag_action" value="save" class="ag-btn ag-btn-light">Nur speichern</button>
                </div>
            </form>
        </div>
        <?php
        return ob_get_clean();
    }

    /**
     * Wandelt ein gespeichertes Anzeige-Datum "DD.MM.YYYY" zurück in "Y-m-d"
     * für das <input type="date">. Andere Formate werden bestmöglich geparst.
     */
    private static function to_input_date( $value ) {
        $value = trim( (string) $value );
        if ( '' === $value ) {
            return '';
        }
        if ( preg_match( '/^(\d{2})\.(\d{2})\.(\d{4})$/', $value, $m ) ) {
            return $m[3] . '-' . $m[2] . '-' . $m[1];
        }
        $ts = strtotime( $value );
        return $ts ? gmdate( 'Y-m-d', $ts ) : '';
    }

    /**
     * Stellt die für die Live-Vorschau des Concepto-Satzes benötigten
     * Übersetzungsdaten für JavaScript bereit (Sprachnamen, Modalitäten,
     * Satzvorlagen je Dokumentsprache).
     */
    private static function js_i18n() {
        $langs = array( 'ES', 'EN', 'DE' );
        $data  = array( 'taught' => array(), 'modality' => array(), 'weekdays' => array(), 'wd_conj' => array( 'ES' => ' y ', 'EN' => ' and ', 'DE' => ' und ' ), 'wd_prefix' => array( 'ES' => 'los ', 'EN' => 'on ', 'DE' => '' ) );

        $taught_codes = array_keys( AG_Offer::LANGUAGES );
        foreach ( $langs as $l ) {
            $data['taught'][ $l ]   = array();
            foreach ( $taught_codes as $tc ) {
                $data['taught'][ $l ][ $tc ] = AG_I18n::taught_language_name( $tc, $l );
            }
            $data['modality'][ $l ] = AG_I18n::modality_options( $l );
            $data['weekdays'][ $l ] = AG_I18n::weekday_names( $l );
        }
        return $data;
    }
}
