<?php
/**
 * Diagnostika Meta Conversions API — stav, log a doposlání zmeškaných nákupů.
 */

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

add_action( 'admin_menu', 'elementsell_meta_capi_register_hidden_page' );
add_action( 'admin_post_elementsell_meta_capi_resend', 'elementsell_meta_capi_resend_handle' );
add_action( 'admin_post_elementsell_meta_capi_save', 'elementsell_meta_capi_save_handle' );
add_action( 'admin_notices', 'elementsell_meta_capi_admin_notice' );

/**
 * @return void
 */
function elementsell_meta_capi_register_hidden_page() {
    add_submenu_page(
        null,
        'Meta Conversions API',
        'Meta Conversions API',
        'manage_options',
        'elementsell-meta-capi',
        'elementsell_meta_capi_render_page'
    );
}

/**
 * @return string
 */
function elementsell_get_meta_capi_admin_url() {
    return admin_url( 'admin.php?page=elementsell-meta-capi' );
}

/**
 * Zaplacené objednávky za posledních 7 dní, které nemají odeslaný Purchase.
 * Delší okno nemá smysl — Meta starší události nepřijímá.
 *
 * @return array<int, object>
 */
function elementsell_meta_capi_get_missing_orders() {
    global $wpdb;

    $orders_table = $wpdb->prefix . 'elementsell_orders';
    $fields_table = $wpdb->prefix . 'elementsell_order_fields';

    return (array) $wpdb->get_results(
        $wpdb->prepare(
            "SELECT o.id, o.order_uid, o.email, o.amount, o.currency, o.paid_at, o.product_name
             FROM {$orders_table} o
             LEFT JOIN {$fields_table} f
                    ON f.order_id = o.id AND f.field_name = 'meta_purchase_sent_at'
             WHERE o.payment_status = %s
               AND o.paid_at IS NOT NULL
               AND o.paid_at >= %s
               AND f.id IS NULL
             ORDER BY o.paid_at DESC
             LIMIT 100",
            'paid',
            // paid_at je v DB v lokální zóně webu — hranici počítáme taky lokálně.
            wp_date( 'Y-m-d H:i:s', time() - ( 7 * DAY_IN_SECONDS ) )
        )
    );
}

/**
 * @return void
 */
function elementsell_meta_capi_resend_handle() {
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( esc_html__( 'Nemáte oprávnění.', 'platebni-formular' ) );
    }

    check_admin_referer( 'elementsell_meta_capi_resend' );

    $sent   = 0;
    $failed = 0;

    foreach ( elementsell_meta_capi_get_missing_orders() as $order ) {
        $result = elementsell_meta_capi_send_purchase( (int) $order->id );

        if ( ! empty( $result['sent'] ) ) {
            $sent++;
        } else {
            $failed++;
        }
    }

    wp_safe_redirect(
        add_query_arg(
            [
                'es_capi_sent'   => $sent,
                'es_capi_failed' => $failed,
            ],
            elementsell_get_meta_capi_admin_url()
        )
    );
    exit;
}

/**
 * Uloží pixel ID a access token. Token se nikdy nevypisuje zpátky do formuláře.
 *
 * @return void
 */
function elementsell_meta_capi_save_handle() {
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( esc_html__( 'Nemáte oprávnění.', 'platebni-formular' ) );
    }

    check_admin_referer( 'elementsell_meta_capi_save' );

    $pixel_id = isset( $_POST['meta_pixel_id'] )
        ? preg_replace( '/[^0-9]/', '', (string) wp_unslash( $_POST['meta_pixel_id'] ) )
        : '';

    update_option( 'meta_pixel_id', $pixel_id );

    $token = isset( $_POST['meta_capi_token'] )
        ? trim( sanitize_text_field( wp_unslash( $_POST['meta_capi_token'] ) ) )
        : '';

    // Prázdné pole nechá stávající token být; smazat jde zaškrtávátkem.
    if ( ! empty( $_POST['meta_capi_token_clear'] ) ) {
        update_option( 'meta_capi_token', '' );
    } elseif ( $token !== '' ) {
        update_option( 'meta_capi_token', $token );
    }

    wp_safe_redirect( add_query_arg( 'es_capi_saved', '1', elementsell_get_meta_capi_admin_url() ) );
    exit;
}

/**
 * Upozorní v administraci, když CAPI není nastavená nebo poslední pokusy selhaly.
 *
 * @return void
 */
function elementsell_meta_capi_admin_notice() {
    if ( ! current_user_can( 'manage_options' ) ) {
        return;
    }

    $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;

    if ( ! $screen || strpos( (string) $screen->id, 'elementsell' ) === false ) {
        return;
    }

    if ( isset( $_GET['page'] ) && $_GET['page'] === 'elementsell-meta-capi' ) {
        return;
    }

    $log    = get_option( ELEMENTSELL_META_CAPI_LOG_OPTION, [] );
    $latest = is_array( $log ) && ! empty( $log[0] ) ? $log[0] : null;

    if ( ! $latest || ( isset( $latest['status'] ) && $latest['status'] !== 'error' ) ) {
        return;
    }

    printf(
        '<div class="notice notice-error"><p><strong>Meta CAPI:</strong> %s <a href="%s">Diagnostika</a></p></div>',
        esc_html( (string) $latest['message'] ),
        esc_url( elementsell_get_meta_capi_admin_url() )
    );
}

/**
 * @return void
 */
function elementsell_meta_capi_render_page() {
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( esc_html__( 'Nemáte oprávnění.', 'platebni-formular' ) );
    }

    $pixel_id = elementsell_meta_capi_get_pixel_id();
    $has_token = elementsell_meta_capi_get_token() !== '';
    $enabled   = elementsell_meta_capi_is_enabled();
    $missing   = elementsell_meta_capi_get_missing_orders();
    $log       = get_option( ELEMENTSELL_META_CAPI_LOG_OPTION, [] );

    if ( ! is_array( $log ) ) {
        $log = [];
    }

    $own_token = trim( (string) get_option( 'meta_capi_token', '' ) ) !== '';
    ?>
    <div class="wrap">
        <h1>Meta Conversions API</h1>

        <?php if ( isset( $_GET['es_capi_saved'] ) ) : ?>
            <div class="notice notice-success"><p>Uloženo.</p></div>
        <?php endif; ?>

        <?php if ( isset( $_GET['es_capi_sent'] ) ) : ?>
            <div class="notice notice-info">
                <p>
                    Odesláno: <strong><?php echo (int) $_GET['es_capi_sent']; ?></strong>,
                    selhalo: <strong><?php echo isset( $_GET['es_capi_failed'] ) ? (int) $_GET['es_capi_failed'] : 0; ?></strong>.
                </p>
            </div>
        <?php endif; ?>

        <h2>Stav</h2>
        <table class="widefat striped" style="max-width:760px">
            <tbody>
                <tr>
                    <td style="width:260px"><strong>Odesílání Purchase</strong></td>
                    <td>
                        <?php if ( $enabled ) : ?>
                            <span style="color:#116329">✓ aktivní</span>
                        <?php else : ?>
                            <span style="color:#8a1f11">✕ neaktivní</span>
                        <?php endif; ?>
                    </td>
                </tr>
                <tr>
                    <td><strong>Pixel ID</strong></td>
                    <td><?php echo $pixel_id !== '' ? esc_html( $pixel_id ) : '<em>chybí</em>'; ?></td>
                </tr>
                <tr>
                    <td><strong>Access token</strong></td>
                    <td>
                        <?php if ( ! $has_token ) : ?>
                            <em>chybí</em>
                        <?php elseif ( $own_token ) : ?>
                            nastaven ve widgetu ElementSellu
                        <?php else : ?>
                            převzatý z pluginu „Meta pixel pro WordPress“
                        <?php endif; ?>
                    </td>
                </tr>
                <tr>
                    <td><strong>Zaplaceno bez odeslaného Purchase</strong><br><span class="description">za posledních 7 dní</span></td>
                    <td><?php echo count( $missing ); ?></td>
                </tr>
                <?php
                $pixel_ready = function_exists( 'elementsell_meta_pixel_is_enabled' )
                    && elementsell_meta_pixel_is_enabled()
                    && $pixel_id !== '';
                $last_px = (array) get_option( 'elementsell_meta_pixel_last_purchase', [] );
                ?>
                <tr>
                    <td>
                        <strong>Purchase i z prohlížeče</strong><br>
                        <span class="description">Meta obě zprávy spáruje přes event_id a započítá nákup jednou</span>
                    </td>
                    <td>
                        <?php if ( $pixel_ready ) : ?>
                            <span style="color:#116329">✓ aktivní</span>
                        <?php else : ?>
                            <span style="color:#8a1f11">✕ neaktivní</span>
                        <?php endif; ?>

                        <?php if ( ! empty( $last_px['cas'] ) ) : ?>
                            <br><span class="description">
                                naposledy <?php echo esc_html( get_date_from_gmt( (string) $last_px['cas'], 'j. n. Y H:i' ) ); ?>
                                <?php if ( ! empty( $last_px['event_id'] ) ) : ?>
                                    · <code><?php echo esc_html( (string) $last_px['event_id'] ); ?></code>
                                <?php endif; ?>
                                <?php if ( ! empty( $last_px['vlastni_pixel'] ) ) : ?>
                                    · vložen i základní pixel
                                <?php else : ?>
                                    · použit pixel už na stránce
                                <?php endif; ?>
                            </span>
                        <?php elseif ( $pixel_ready ) : ?>
                            <br><span class="description">zatím neproběhl žádný nákup s načtenou děkovací stránkou</span>
                        <?php endif; ?>
                    </td>
                </tr>
            </tbody>
        </table>

        <h2>Nastavení</h2>
        <p class="description" style="max-width:760px">
            Když necháš obojí prázdné, ElementSell si pixel i token vezme z pluginu
            „Meta pixel pro WordPress“. Vyplň jen tehdy, když chceš posílat jinam
            nebo na tomhle webu Meta plugin není.
        </p>
        <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
            <input type="hidden" name="action" value="elementsell_meta_capi_save">
            <?php wp_nonce_field( 'elementsell_meta_capi_save' ); ?>
            <table class="form-table" style="max-width:760px">
                <tr>
                    <th scope="row"><label for="es-meta-pixel-id">Pixel ID</label></th>
                    <td>
                        <input type="text" class="regular-text" id="es-meta-pixel-id" name="meta_pixel_id"
                               value="<?php echo esc_attr( (string) get_option( 'meta_pixel_id', '' ) ); ?>"
                               inputmode="numeric" autocomplete="off">
                    </td>
                </tr>
                <tr>
                    <th scope="row"><label for="es-meta-token">Access token</label></th>
                    <td>
                        <input type="password" class="regular-text" id="es-meta-token" name="meta_capi_token"
                               value="" autocomplete="new-password"
                               placeholder="<?php echo $own_token ? 'uložen — ponech prázdné pro zachování' : 'vlož token z Events Manageru'; ?>">
                        <?php if ( $own_token ) : ?>
                            <p><label><input type="checkbox" name="meta_capi_token_clear" value="1"> smazat uložený token</label></p>
                        <?php endif; ?>
                    </td>
                </tr>
            </table>
            <button type="submit" class="button">Uložit</button>
        </form>

        <?php if ( ! empty( $missing ) ) : ?>
            <h2>Doposlat zmeškané</h2>
            <p class="description">
                Meta přijímá události max 7 dní zpětně, starší objednávky už doposlat nejde.
            </p>
            <table class="widefat striped" style="max-width:760px">
                <thead>
                    <tr><th>Zaplaceno</th><th>Produkt</th><th>E-mail</th><th>Částka</th></tr>
                </thead>
                <tbody>
                <?php foreach ( array_slice( $missing, 0, 20 ) as $order ) : ?>
                    <tr>
                        <td><?php echo esc_html( (string) $order->paid_at ); ?></td>
                        <td><?php echo esc_html( (string) $order->product_name ); ?></td>
                        <td><?php echo esc_html( (string) $order->email ); ?></td>
                        <td><?php echo esc_html( number_format_i18n( (float) $order->amount, 2 ) . ' ' . $order->currency ); ?></td>
                    </tr>
                <?php endforeach; ?>
                </tbody>
            </table>

            <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" style="margin-top:12px">
                <input type="hidden" name="action" value="elementsell_meta_capi_resend">
                <?php wp_nonce_field( 'elementsell_meta_capi_resend' ); ?>
                <button type="submit" class="button button-primary"<?php disabled( ! $enabled ); ?>>
                    Doposlat do Mety (<?php echo count( $missing ); ?>)
                </button>
            </form>
        <?php endif; ?>

        <h2>Log posledních pokusů</h2>
        <?php if ( empty( $log ) ) : ?>
            <p><em>Zatím nic. Log se naplní po první zaplacené objednávce.</em></p>
        <?php else : ?>
            <table class="widefat striped" style="max-width:960px">
                <thead>
                    <tr><th style="width:160px">Čas</th><th style="width:100px">Objednávka</th><th style="width:80px">Stav</th><th>Zpráva</th></tr>
                </thead>
                <tbody>
                <?php foreach ( $log as $row ) : ?>
                    <tr>
                        <td><?php echo esc_html( (string) ( $row['time'] ?? '' ) ); ?></td>
                        <td><?php echo (int) ( $row['order_id'] ?? 0 ); ?></td>
                        <td>
                            <?php if ( ( $row['status'] ?? '' ) === 'ok' ) : ?>
                                <span style="color:#116329">ok</span>
                            <?php else : ?>
                                <span style="color:#8a1f11">chyba</span>
                            <?php endif; ?>
                        </td>
                        <td><?php echo esc_html( (string) ( $row['message'] ?? '' ) ); ?></td>
                    </tr>
                <?php endforeach; ?>
                </tbody>
            </table>
        <?php endif; ?>
    </div>
    <?php
}
