<?php
declare(strict_types=1);

require_once dirname(__DIR__) . '/db_bootstrap.php';
require_once dirname(__DIR__) . '/subscriber_id_sequence_lib.php';

function sis_assert(bool $condition, string $message): void
{
    if (!$condition) throw new RuntimeException($message);
}

$policy = ['prefix' => '260', 'min_length' => 6, 'max_value' => 2147483647];
sis_assert(ua_subscriber_id_candidate_error($policy, 260123, '260123') === '', 'يجب السماح بالإبقاء على الرقم الحالي.');
sis_assert(ua_subscriber_id_candidate_error($policy, 260123, '260999') === '', 'يجب قبول رقم جديد صالح من السلسلة نفسها.');
sis_assert(ua_subscriber_id_candidate_error($policy, 260123, '26099') !== '', 'يجب رفض الرقم الأقصر من الحد الأدنى.');
sis_assert(ua_subscriber_id_candidate_error($policy, 260123, '261999') !== '', 'يجب رفض رقم من سلسلة أخرى.');
sis_assert(ua_subscriber_id_candidate_error($policy, 260123, '260A99') !== '', 'يجب رفض المحارف غير الرقمية.');

$conn = ensure_db(true);
ua_subscriber_id_registry_ensure($conn);
$rowResult = $conn->query('SELECT id FROM subscribers WHERE id>0 ORDER BY id DESC LIMIT 1');
$row = $rowResult ? $rowResult->fetch_assoc() : null;
sis_assert(is_array($row) && (int)$row['id'] > 0, 'يلزم وجود مشترك واحد على الأقل لاختبار اكتشاف السلسلة.');
$currentId = (int)$row['id'];
$detected = ua_subscriber_id_series_policy($conn, $currentId);
sis_assert((int)$detected['min_length'] === 6, 'الحد الأدنى يجب أن يكون ست خانات.');
sis_assert((string)$detected['prefix'] !== '', 'يجب اكتشاف سلسلة الجهاز تلقائياً.');
sis_assert(ua_subscriber_id_availability_error($conn, $currentId, $currentId) === '', 'الرقم الحالي لا يعد تعارضاً مع نفسه.');
$registered = $conn->query('SELECT serial_id FROM subscriber_id_registry WHERE serial_id=' . $currentId . ' LIMIT 1');
sis_assert($registered && $registered->num_rows === 1, 'يجب حفظ الرقم الحالي في سجل عدم إعادة الاستخدام.');
$missing = $conn->query('SELECT COUNT(*) missing_count FROM subscribers s LEFT JOIN subscriber_id_registry r ON r.serial_id=s.id WHERE s.id>0 AND r.serial_id IS NULL');
$missingRow = $missing ? $missing->fetch_assoc() : null;
sis_assert((int)($missingRow['missing_count'] ?? -1) === 0, 'يجب تسجيل جميع الأرقام الحالية قبل السماح بالتعديل أو الحذف النهائي.');
$otherResult = $conn->query('SELECT id FROM subscribers WHERE id>0 AND id<>' . $currentId . ' ORDER BY id DESC LIMIT 1');
$other = $otherResult ? $otherResult->fetch_assoc() : null;
if (is_array($other) && (int)$other['id'] > 0) {
    sis_assert(ua_subscriber_id_availability_error($conn, $currentId, (int)$other['id']) !== '', 'يجب رفض رقم مستخدم لدى مشترك آخر.');
}

echo "subscriber_id_sequence_policy_test: OK\n";
