<?php
declare(strict_types=1);

namespace Itdatex\Rechnungseingang;

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

use Itdatex\Rechnungseingang\Admin\Menu;
use Itdatex\Rechnungseingang\Admin\Pages\Inbox;
use Itdatex\Rechnungseingang\Admin\Pages\Invoice;
use Itdatex\Rechnungseingang\Admin\Pages\Upload;

/**
 * Zentrales Bootstrap-Objekt. Wird per plugins_loaded->boot() initialisiert.
 */
final class Plugin
{
    public const CAPABILITY = 'reing_manage_invoices';
    public const TEXT_DOMAIN = 'itdatex-e-invoice-intake';

    private static ?self $instance = null;

    public static function instance(): self
    {
        return self::$instance ??= new self();
    }

    public function boot(): void
    {
        // Hinweis: load_plugin_textdomain() ist auf wp.org seit WP 4.6 nicht
        // mehr noetig — WordPress laedt die Uebersetzungen automatisch.

        // Admin-UI & Upload nur im Backend
        if ( is_admin() ) {
            ( new Menu() )->register();
            ( new Inbox() )->register();
            ( new Invoice() )->register();
            ( new Upload() )->register();
            ( new UploadHandler() )->register();
        }

        ( new DownloadHandler() )->register();

        // Add-on-API: erlaubt Pro / anderen Plugins, gewhitelistete Felder
        // an einer Rechnung zu aktualisieren. Wir prozessieren das hier
        // zentral, damit Audit-Eintrag und Type-Casting konsistent sind.
        add_action( 'reing_apply_invoice_fields', [ $this, 'apply_invoice_fields' ], 10, 3 );
    }

    /**
     * Handler fuer den 'reing_apply_invoice_fields'-Action.
     *
     * @param int                  $invoice_id
     * @param array<string, mixed> $fields
     * @param string               $source   Frei wahlbarer Quellen-Tag fuer das Audit (z.B. 'ai_draft').
     */
    public function apply_invoice_fields( int $invoice_id, array $fields, string $source = 'ai_draft' ): void
    {
        if ( $invoice_id <= 0 || ! $fields ) {
            return;
        }
        $repo    = new InvoiceRepository();
        $updated = $repo->updateFields( $invoice_id, $fields );
        if ( ! $updated ) {
            return;
        }
        $actor = function_exists( 'wp_get_current_user' )
            ? ( wp_get_current_user()->user_login ?: 'system' )
            : 'system';
        $repo->appendAudit(
            $invoice_id,
            (string) $actor,
            'fields_applied',
            sprintf( 'source=%s, fields=%s', $source, implode( ',', $updated ) )
        );
    }

}
