<?php

namespace App\Support;

/**
 * Türkçe karaktere ve büyük/küçük harfe duyarsız arama yardımcıları.
 *
 * Hem PHP tarafında aranan terim hem SQL tarafında kolonlar aynı haritayla
 * normalize edilir; böylece "IŞIL", "ışıl", "İstanbul", "istanbul" gibi
 * yazımların tümü eşleşir. MySQL REPLACE() harfe duyarlı çalıştığı için
 * harita SQL tarafında birebir uygulanabilir.
 */
class TurkishSearch
{
    public const CHAR_MAP = [
        'İ' => 'i', 'I' => 'i', 'ı' => 'i',
        'Ş' => 's', 'ş' => 's',
        'Ğ' => 'g', 'ğ' => 'g',
        'Ü' => 'u', 'ü' => 'u',
        'Ö' => 'o', 'ö' => 'o',
        'Ç' => 'c', 'ç' => 'c',
    ];

    /** Verilen SQL ifadesini normalize eden ifadeyi döndürür. */
    public static function normalizedSql(string $expr): string
    {
        foreach (self::CHAR_MAP as $from => $to) {
            $expr = "REPLACE({$expr}, '{$from}', '{$to}')";
        }

        return "LOWER({$expr})";
    }

    /** PHP tarafında aynı normalizasyon. */
    public static function normalize(string $s): string
    {
        return mb_strtolower(strtr(trim($s), self::CHAR_MAP), 'UTF-8');
    }

    /**
     * Aranan metni normalize edip kelimelere böler.
     * Çok kelimeli aramada her kelime kayıtta bir yerde geçmelidir
     * ("Ahmet Yılmaz" → hem ad hem soyad eşleşir).
     */
    public static function tokens(string $term): array
    {
        return array_values(array_filter(preg_split('/\s+/u', self::normalize($term)) ?: []));
    }

    /** LIKE kalıbı içinde joker karakterleri etkisizleştirir. */
    public static function escapeLike(string $token): string
    {
        return addcslashes($token, '\\%_');
    }
}
