<?php

namespace BWDK\Admin;

use BWDK\Admin\Tools\MigratePhones;
use BWDK\Core\App;
use BWDK\Integrations\Digify\Client;
use BWDK\Support\Constant;
use WP_Error;

class SettingsPage
{
    const OPTION_GROUP = 'bwdk_settings';
    const OPTION_NAME  = Constant::BWDK_OPTION_NAME;
    const PAGE_SLUG    = 'buy-with-digikala';

    public function register(): void
    {
        add_action('admin_menu', [$this, 'addMenuPage']);
        add_action('admin_init', [$this, 'registerSettings']);
    }

    public function addMenuPage(): void
    {
        global $admin_page_hooks;
        add_menu_page(
            __('خرید با دیجی‌کالا', 'bwdk'),
            __('خرید با دیجی‌کالا', 'bwdk'),
            'manage_options',
            'bwdk',
            [$this, 'bwdk_home_page_render'],
            BWDK_ADMIN_IMG . 'bwdk-icon.svg',
            56
        );

        $admin_page_hooks["bwdk"]="bwdk";

        add_submenu_page(
            'bwdk',
            'داشبورد خرید با دیجی‌کالا',
            'داشبورد',
            'manage_options',
            'bwdk',
            [$this, 'bwdk_home_page_render'],
            0
        );


        add_submenu_page(
            'bwdk',
            'تنظیمات اتصال',
            'تنظیمات',
            'manage_options',
            'bwdk-setting',
            [$this, 'bwdk_setting_page_render'],
            1
        );

        // Register migration tool
        if (class_exists(MigratePhones::class)) {
            App::bind(MigratePhones::class, new MigratePhones());
            App::get(MigratePhones::class)->register();
        }
    }

    public function registerSettings(): void
    {
        register_setting(self::OPTION_GROUP, self::OPTION_NAME, [$this, 'validateSettings']);

        register_setting(
            self::OPTION_GROUP,
            Constant::OPTION_BWDK_ENABLE_DIGIEXPRESS,
            [
                'type'              => 'string',
                'default'           => '0',
                'sanitize_callback' => static function ( $value ): string {
                    return ( $value === '1' || $value === 1 || $value === true ) ? '1' : '0';
                },
            ]
        );

        add_settings_section(
            'bwdk_main_section',
            'تنظیمات اصلی',
            fn() => print '<p>پارامترهای اتصال به دیجی‌کالا را وارد کنید.</p>',
            'bwdk-setting'
        );

        add_settings_field(
            'api_token',
            'توکن API دیجی‌کالا',
            [$this, 'renderTokenField'],
            'bwdk-setting',
            'bwdk_main_section'
        );

        add_settings_section(
            'bwdk_phone_section',
            'عضویت/موبایل',
            fn() => print '<p>تنظیمات مربوط به ساخت خودکار کاربر و فرمت موبایل.</p>',
            'bwdk-setting'
        );

        add_settings_field(
            Constant::OPT_PHONE_FORMAT,
            'فرمت نمایش/ذخیره موبایل',
            [$this, 'renderPhoneFormatField'],
            'bwdk-setting',
            'bwdk_phone_section'
        );
    }

    public function validateSettings( $input){

        // Merge with existing options
        $existing = get_option(self::OPTION_NAME, []);
        
        // Normalize single-buy-button status
        if (isset($input['single-buy-button']['status'])) {
            $input['single-buy-button']['status'] = empty($input['single-buy-button']['status']) ? '0' : '1';
        } else {
            $input['single-buy-button']['status'] = '0';
        }

        // Merge with existing settings  
        $input = array_replace_recursive($existing, $input);

        $API = trim($input['api']['api-key'] ?? '');
        // Normalize API key so we always store the raw key (no "Api-Key"/"Authorization:" prefixes)
        if ($API !== '') {
            $API = preg_replace('/^\s*Authorization\s*:\s*/i', '', $API);
            $API = is_string($API) ? $API : '';
            $API = preg_replace('/^\s*Api-Key\s+/i', '', $API);
            $API = is_string($API) ? trim($API) : '';
        }
        $input['api']['api-key'] = $API;
        if ($API !== '') {
            $auth_result = (new Client())->merchantsAuthStatus($API);

            if (is_array($auth_result)) {
                // Distinguish transient network/timeout from definitive auth failure (avoid false negatives)
                if (!empty($auth_result['transient_error'])) {
                    $reason = is_string($auth_result['error'] ?? null) ? (string) $auth_result['error'] : 'network';
                    if ($reason === 'timeout') {
                        $input['api']['api-key-status'] = 'تست اتصال انجام نشد (Timeout). کلید API ذخیره شد؛ اگر سرویس در عمل کار می‌کند، این پیام را نادیده بگیرید.';
                    } else {
                        $input['api']['api-key-status'] = 'تست اتصال انجام نشد (خطای موقت شبکه). کلید API ذخیره شد؛ اگر سرویس در عمل کار می‌کند، این پیام را نادیده بگیرید.';
                    }
                } elseif (!$auth_result['success'] || !$auth_result['authenticated']) {
                    $input['api']['api-key-status'] = $auth_result['error'] ?? 'احراز هویت ناموفق';
                } else {
                    $input['api']['api-key-status'] = '';
                }
            } else {
                // Backward-compatible fallback for unexpected return types
                $input['api']['api-key-status'] = 'احراز هویت ناموفق';
            }
        } else {
            $input['api']['api-key-status'] = 'کلید API تنظیم نشده است.';
        }


        return $input;
    }

    public function renderTokenField(): void
    {
        $options = get_option(self::OPTION_NAME);

        $token = $options['api_token'] ?? '';

        echo "<input type='text' name='" . self::OPTION_NAME . "[api_token]' value='" . esc_attr($token) . "' class='regular-text' />";
    }

    public function renderPhoneFormatField(): void
    {
        $options = get_option(self::OPTION_NAME);
        $format = $options[Constant::OPT_PHONE_FORMAT] ?? 'country_no_plus';

        $formats = [
            'with_zero' => '09xxxxxxxxx',
            'no_zero' => '9xxxxxxxxx',
            'country_plus' => '+989xxxxxxxxx',
            'country_no_plus' => '989xxxxxxxxx',
        ];

        echo '<select name="' . self::OPTION_NAME . '[' . Constant::OPT_PHONE_FORMAT . ']" class="regular-text">';
        foreach ($formats as $value => $label) {
            $selected = ($format === $value) ? 'selected' : '';
            echo '<option value="' . esc_attr($value) . '" ' . $selected . '>' . esc_html($label) . '</option>';
        }
        echo '</select>';
        echo '<p class="description">فرمت نمایش/ذخیره موبایل در سایت. مرجع داخلی افزونه همیشه E.164 بدون + است.</p>';
    }

    public function bwdk_home_page_render(): void
    {
        require BWDK_ADMIN_TEMPLATE . 'home.php';
    }

    public function bwdk_setting_page_render(): void
    {
        require BWDK_ADMIN_TEMPLATE . 'setting.php';
    }
}
