<?php
declare(strict_types=1);

namespace Celena\Plugin\Shop\Support;

use Celena\Module\Settings\Options;

/**
 * Доступ к настройкам магазина. Все ключи хранятся в celena_options
 * с префиксом `shop.` и автозагружаются (autoload=true) при первом обращении.
 *
 * Используется и в админке (форма /admin/shop/settings), и в публичных
 * шаблонах через тег {price amount="..."} — символ валюты и формат
 * подтягиваются отсюда, чтобы поменять валюту можно было одной кнопкой.
 */
final class ShopSettings
{
    /** Дефолты — применяются, если значение не сохранено ни разу. */
    public const DEFAULTS = [
        // Общие
        'shop.store_name'         => 'Мой магазин',
        'shop.contact_email'      => '',
        'shop.contact_phone'      => '',
        'shop.address'            => '',
        // Валюта и формат — после установки CMS по умолчанию USD.
        'shop.currency_code'      => 'USD',
        'shop.currency_symbol'    => '$',
        'shop.currency_position'  => 'before', // before | after
        'shop.price_decimals'     => '2',
        'shop.thousands_sep'      => ',',
        'shop.decimal_sep'        => '.',
        // Каталог
        'shop.products_per_page'  => '24',
        'shop.show_out_of_stock'  => '1',
        'shop.show_sku'           => '1',
        'shop.show_rating'        => '1',
        'shop.allow_guest_checkout' => '1',
        // Заказы
        'shop.order_number_prefix' => 'ORD-',
        'shop.order_initial_status' => 'new',
        'shop.min_order_amount'   => '0',
        'shop.notify_email'       => '',
        // Чекаут — обязательные поля
        'shop.checkout_require_phone'   => '1',
        'shop.checkout_require_email'   => '1',
        'shop.checkout_require_address' => '1',
        'shop.checkout_thank_text'      => 'Спасибо за заказ! Мы свяжемся с вами в ближайшее время.',
        // Налоги
        'shop.tax_enabled'        => '0',
        'shop.tax_rate'           => '12',
        'shop.tax_included'       => '1',
    ];

    public function __construct(private readonly Options $options)
    {
    }

    public function get(string $key, ?string $default = null): string
    {
        $stored = $this->options->get($key, null);
        if ($stored !== null && $stored !== '') {
            return (string) $stored;
        }
        return (string) ($default ?? self::DEFAULTS[$key] ?? '');
    }

    public function bool(string $key): bool
    {
        return in_array(strtolower($this->get($key)), ['1', 'true', 'yes', 'on'], true);
    }

    public function int(string $key, int $default = 0): int
    {
        $v = $this->get($key);
        return $v === '' ? $default : (int) $v;
    }

    /** Форматирует цену согласно настройкам (decimals, разделители, символ, позиция). */
    public function formatPrice(float|int|string|null $amount): string
    {
        $value = (float) ($amount ?? 0);
        $decimals = $this->int('shop.price_decimals', 0);
        $thousands = $this->get('shop.thousands_sep') ?: ' ';
        $decimalSep = $this->get('shop.decimal_sep') ?: '.';
        $number = number_format($value, $decimals, $decimalSep, $thousands);
        $symbol = $this->get('shop.currency_symbol') ?: '';
        if ($symbol === '') return $number;
        return $this->get('shop.currency_position') === 'before'
            ? $symbol . ' ' . $number
            : $number . ' ' . $symbol;
    }

    public function currencySymbol(): string  { return $this->get('shop.currency_symbol'); }
    public function currencyCode(): string    { return $this->get('shop.currency_code'); }
    public function storeName(): string       { return $this->get('shop.store_name'); }

    /** Все настройки одним массивом — для шаблона форма / для globals в темах. */
    public function all(): array
    {
        $out = [];
        foreach (self::DEFAULTS as $key => $default) {
            $out[$key] = $this->get($key, $default);
        }
        return $out;
    }
}
