<?php

namespace App\Core\Payment\Concerns;

/**
 * PRC-689 — Taksit para birimi geçidi.
 *
 * TR pazarında kredi kartı taksiti yalnızca TRY (veya admin'in izin verdiği
 * para birimlerinde) sunulmalıdır. Bu trait, gateway'in `installment_currencies`
 * config alanını okuyup verilen para biriminin taksite uygun olup olmadığını
 * belirler.
 *
 * Kullanım: `AbstractPayment::getInstallmentPlans()` içinde, plan üretmeden önce
 * `$this->installmentCurrencyAllowed($currencyCode)` ile kapı kontrolü yapılır;
 * uygun değilse boş dizi dönerek seçici gizlenir (yalnızca tek çekim).
 *
 * `AbstractPayment::installmentConfigFields()` bu trait'in beklediği
 * `installment_currencies` alanını (CSV, varsayılan "TRY") sağlar.
 */
trait GatesInstallmentByCurrency
{
    /**
     * Verilen para birimi kodu, bu gateway'in taksit için izin verdiği listede mi?
     *
     * Kurallar:
     *  - `$currencyCode` null/boş ise → true (geriye-uyum: eski çağıranlar currency
     *    geçirmezse eski davranış korunur; asıl kapı çağıranın currency geçirmesiyle işler).
     *  - `installment_currencies` config'i boş/eksik ise → varsayılan yalnızca TRY.
     *  - Karşılaştırma büyük/küçük harf duyarsız + trim'li.
     *
     * @param string|null $currencyCode ISO kodu, örn. "TRY", "USD".
     */
    protected function installmentCurrencyAllowed(?string $currencyCode): bool
    {
        // Geriye-uyum: currency belirtilmemişse kapıyı uygulama.
        if ($currencyCode === null || trim($currencyCode) === '') {
            return true;
        }

        $allowed = $this->allowedInstallmentCurrencies();

        // Güvenlik varsayılanı: liste bir şekilde boş kalırsa taksit kapalı
        // sayılır (yanlış para biriminde taksit sunmaktansa gizle).
        if ($allowed === []) {
            return false;
        }

        return in_array(strtoupper(trim($currencyCode)), $allowed, true);
    }

    /**
     * `installment_currencies` config CSV'sini normalize edilmiş bir listeye çevirir.
     * Boş/eksikse varsayılan ["TRY"].
     *
     * @return array<int,string> Büyük harfe çevrilmiş, trim'li, tekilleştirilmiş kodlar.
     */
    protected function allowedInstallmentCurrencies(): array
    {
        $raw = (string) $this->getConfig('installment_currencies', 'TRY');

        $codes = array_filter(array_map(static function ($code): string {
            return strtoupper(trim((string) $code));
        }, explode(',', $raw)), static function (string $code): bool {
            return $code !== '';
        });

        if ($codes === []) {
            return ['TRY'];
        }

        return array_values(array_unique($codes));
    }
}
