<?php
declare(strict_types=1);

namespace Itdatex\Ausgangsrechnung;

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

use Itdatex\Ausgangsrechnung\Admin\Menu;
use Itdatex\EInvoiceCore\InvoiceRepository;

/**
 * Toggelt den Zahlungs-Status einer ausgegangenen Rechnung
 * (open ↔ paid). Getriggert vom Button auf der Detail-Seite.
 *
 * Wir setzen bewusst keinen separaten paid_at-Timestamp — die
 * gemeinsame `wp_reing_invoices`-Tabelle hat kein solches Feld und
 * der Zeitpunkt laesst sich zur Not aus dem Audit-Log rekonstruieren.
 */
final class PaymentHandler
{
    public const ACTION = 'ausrg_set_payment';
    public const NONCE  = 'ausrg_set_payment_nonce';

    public function register(): void
    {
        add_action( 'admin_post_' . self::ACTION, [ $this, 'handle' ] );
    }

    public function handle(): void
    {
        if ( ! current_user_can( Plugin::CAPABILITY ) ) {
            wp_die( esc_html__( 'Keine Berechtigung.', 'itdatex-e-invoice-output' ), '', [ 'response' => 403 ] );
        }

        $invoiceId = isset( $_POST['invoice_id'] ) ? (int) $_POST['invoice_id'] : 0;
        if ( $invoiceId <= 0 ) {
            wp_die( esc_html__( 'Ungueltige Anfrage.', 'itdatex-e-invoice-output' ), '', [ 'response' => 400 ] );
        }
        check_admin_referer( self::ACTION . '_' . $invoiceId, self::NONCE );

        $status = isset( $_POST['payment_status'] )
            ? sanitize_key( (string) wp_unslash( $_POST['payment_status'] ) )
            : '';
        if ( ! in_array( $status, [ 'open', 'paid' ], true ) ) {
            wp_die( esc_html__( 'Ungueltiger Zahlungs-Status.', 'itdatex-e-invoice-output' ), '', [ 'response' => 400 ] );
        }

        $repo    = new InvoiceRepository( 'outgoing' );
        $invoice = $repo->findInvoice( $invoiceId );
        if ( ! $invoice || (string) $invoice->direction !== 'outgoing' ) {
            wp_die( esc_html__( 'Rechnung nicht gefunden.', 'itdatex-e-invoice-output' ), '', [ 'response' => 404 ] );
        }

        $repo->setPaymentStatus( $invoiceId, $status );
        $repo->appendAudit(
            $invoiceId,
            wp_get_current_user()->user_login ?: 'system',
            'payment_' . $status,
            sprintf( 'from=%s', (string) $invoice->payment_status )
        );

        wp_safe_redirect( add_query_arg(
            [ 'page' => Menu::SLUG_DETAIL, 'id' => $invoiceId ],
            admin_url( 'admin.php' )
        ) );
        exit;
    }
}
