<?php

namespace App\Support;

use App\Models\Client;
use App\Models\SmsTemplate;

/**
 * PRC-618 — SMS kanal uygunluğunun TEK karar noktası.
 *
 * SendClientSmsJob (gönderim tarafı) ve SendEmailJob (preferred=sms iken
 * e-postayı atlama kararı — Task B) aynı policy'den okur; gate semantiği
 * iki yerde ayrışamaz.
 *
 * ÖNEMLİ SEMANTİK DEĞİŞİKLİK (review fix): exempt (auth/güvenlik) kategorisi
 * artık master sms_notifications + preferred_contact_method gate'ini
 * ATLAMAZ. SMS ücretli bir kanal — opt-out etmiş ya da kanal tercihi
 * e-posta olan müşteriye istenmeyen ücretli SMS (örn. şifre sıfırlama)
 * gitmez. "Auth bildirimi müşteriye DAİMA ulaşır" garantisi e-posta
 * tarafında durur: SendEmailJob exempt kategorisini hiçbir tercihe
 * bakmadan her zaman gönderir. Exempt'in tek ayrıcalığı kategori
 * alt-toggle'larının (invoice_reminders / service_notifications) ona
 * uygulanmamasıdır.
 *
 * Marketing: SMS marketing kanalı yok; consent altyapısı e-posta
 * tarafındadır → SMS daima false.
 */
class ClientNotificationPolicy
{
    /**
     * Aktif + en az bir non-empty content satırı olan SMS template var mı?
     * (Ad: e-posta şablonuyla birebir aynı — PRC-619 ad-eşitliği.) SmsTemplateHelper::fetchContent
     * gereksinimini birebir aynalar — aktif ama içeriksiz template
     * "deliverable" sayılmaz.
     */
    public function smsTemplateDeliverable(string $smsTemplateName): bool
    {
        return SmsTemplate::where('name', $smsTemplateName)
            ->where('status', 'active')
            ->whereHas('contents', fn ($q) => $q->whereNotNull('content')->where('content', '!=', ''))
            ->exists();
    }

    /**
     * Client'a bu kategoride SMS gönderilebilir mi?
     * Template-deliverability HARİÇ — onu smsTemplateDeliverable() ile ayrıca kontrol et.
     */
    public function allowsSmsChannel(Client $client, string $category): bool
    {
        // SMS marketing kanalı yok (consent altyapısı e-posta tarafında).
        if ($category === 'marketing') {
            return false;
        }

        if (empty($client->phone)) {
            return false;
        }

        // Master opt-out her zaman geçerli — exempt DAHİL.
        if (! $client->sms_notifications) {
            return false;
        }

        // Kanal tercihi SMS'i kapsamıyorsa gönderme — exempt DAHİL
        // (auth garantisi e-posta tarafında "exempt daima gönderilir" ile sağlanır).
        if (! in_array($client->preferred_contact_method, ['sms', 'both'], true)) {
            return false;
        }

        // Exempt: kategori alt-toggle'ları auth/güvenlik bildirimlerine uygulanmaz.
        if ($category === 'exempt') {
            return true;
        }

        if ($category === 'invoice' && ! $client->invoice_reminders) {
            return false;
        }

        if ($category === 'service' && ! $client->service_notifications) {
            return false;
        }

        return true;
    }
}
