<?php

namespace App\Core;

use PDO;

/**
 * سياسات الاشتراك والوصول للمختبر (Multi-Tenant)
 */
final class TenantPolicy
{
    /**
     * هل يُسمح للمختبر بالعمل في لوحة المختبر (حالة المختبر + اشتراك فعّال)
     */
    public static function labAccessAllowed(PDO $db, int $tenantId): bool
    {
        if ($tenantId <= 0) {
            return false;
        }
        try {
            $stmt = $db->prepare('SELECT status FROM tenants WHERE id = ? LIMIT 1');
            $stmt->execute([$tenantId]);
            $row = $stmt->fetch();
            if (!$row) {
                return false;
            }
            if (!in_array($row['status'], ['active', 'trial'], true)) {
                return false;
            }
            return self::subscriptionAllowsAccess($db, $tenantId);
        } catch (\Throwable $e) {
            return false;
        }
    }

    /**
     * اشتراك فعّال: لا صفوف في tenant_subscriptions = مسموح (ترقية قديمة)،
     * أو آخر اشتراك بحالة active ولم تنتهِ صلاحيته.
     */
    public static function subscriptionAllowsAccess(PDO $db, int $tenantId): bool
    {
        try {
            $db->query('SELECT id FROM tenant_subscriptions LIMIT 1');
        } catch (\Throwable $e) {
            return true;
        }
        try {
            $stmt = $db->prepare(
                'SELECT status, expires_at FROM tenant_subscriptions WHERE tenant_id = ? ORDER BY started_at DESC, id DESC LIMIT 1'
            );
            $stmt->execute([$tenantId]);
            $sub = $stmt->fetch();
            if (!$sub) {
                return true;
            }
            if (($sub['status'] ?? '') !== 'active') {
                return false;
            }
            $ex = $sub['expires_at'] ?? null;
            if ($ex === null || $ex === '') {
                return true;
            }
            $exTs = strtotime((string)$ex . ' 23:59:59');
            return $exTs >= strtotime('today');
        } catch (\Throwable $e) {
            return true;
        }
    }

    /**
     * @return array{0:bool,1:?string} [مسموح, رسالة خطأ عند الرفض]
     */
    public static function monthlyNewPatientQuotaOk(PDO $db, int $tenantId): array
    {
        try {
            $stmt = $db->prepare(
                'SELECT COALESCE(sp.max_patients_per_month, NULL) AS mx
                 FROM tenants t
                 LEFT JOIN subscription_plans sp ON sp.id = t.plan_id
                 WHERE t.id = ?'
            );
            $stmt->execute([$tenantId]);
            $mx = $stmt->fetchColumn();
            if ($mx === null || $mx === '') {
                return [true, null];
            }
            $max = (int)$mx;
            if ($max <= 0) {
                return [true, null];
            }
            $db->query('SELECT created_at FROM patients LIMIT 1');
            $stmt = $db->prepare(
                'SELECT COUNT(*) FROM patients WHERE tenant_id = ?
                 AND created_at >= DATE_FORMAT(NOW(), \'%Y-%m-01\')
                 AND created_at < DATE_ADD(DATE_FORMAT(NOW(), \'%Y-%m-01\'), INTERVAL 1 MONTH)'
            );
            $stmt->execute([$tenantId]);
            $cnt = (int)$stmt->fetchColumn();
            if ($cnt >= $max) {
                return [false, 'تم بلوغ الحد الأقصى لعدد المرضى الجدد لهذا الشهر حسب خطتك (' . $max . '). ترقية الخطة أو انتظار الشهر القادم.'];
            }
        } catch (\Throwable $e) {
            return [true, null];
        }
        return [true, null];
    }
}
