<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Russia E-Visa Management System - V3</title>

<style>
@import url('https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;500;600;700&display=swap');

:root{
    --blue:#1261a0;
    --blue-dark:#0b4779;
    --blue-light:#eaf4fc;
    --gray:#64748b;
    --light:#f5f8fb;
    --border:#d9e2ec;
    --white:#fff;
    --green:#168653;
    --orange:#d97706;
    --red:#c62828;
    --purple:#7048a8;
    --shadow:0 4px 18px rgba(15,45,70,.08);
}

*{box-sizing:border-box}

body{
    margin:0;
    background:#f4f7fa;
    color:#243447;
    font-family:"Vazirmatn",Tahoma,sans-serif;
    font-size:12px;
}

button,input,select,textarea{font-family:inherit;font-size:12px}
button{cursor:pointer}
.hidden{display:none!important}

.topbar{
    background:linear-gradient(135deg,var(--blue-dark),var(--blue));
    color:#fff;
    min-height:62px;
    display:flex;
    align-items:center;
    justify-content:space-between;
    padding:0 24px;
    box-shadow:0 2px 10px #0002;
}

.brand{font-size:17px;font-weight:700}
.brand small{display:block;font-size:10px;opacity:.85;font-weight:400}

.top-actions{display:flex;gap:7px;align-items:center}

.container{max-width:1350px;margin:20px auto;padding:0 14px}

.card{
    background:#fff;
    border:1px solid var(--border);
    border-radius:10px;
    box-shadow:var(--shadow);
    margin-bottom:16px;
}

.card-header{
    padding:13px 16px;
    border-bottom:1px solid var(--border);
    display:flex;
    justify-content:space-between;
    align-items:center;
    background:#fbfdff;
    border-radius:10px 10px 0 0;
}

.card-header h3{margin:0;color:var(--blue-dark);font-size:14px}
.card-body{padding:16px}

.grid{
    display:grid;
    grid-template-columns:repeat(12,1fr);
    gap:10px;
}

.col-12{grid-column:span 12}
.col-9{grid-column:span 9}
.col-8{grid-column:span 8}
.col-6{grid-column:span 6}
.col-4{grid-column:span 4}
.col-3{grid-column:span 3}

label{
    display:block;
    font-weight:600;
    margin-bottom:5px;
    color:#334155;
}

.required{color:#c62828}

input,select,textarea{
    width:100%;
    border:1px solid #cbd5e1;
    border-radius:6px;
    padding:8px 9px;
    background:#fff;
    color:#1e293b;
    outline:none;
}

input:focus,select:focus,textarea:focus{
    border-color:var(--blue);
    box-shadow:0 0 0 2px #1261a012;
}

textarea{min-height:70px;resize:vertical}

.btn{
    border:0;
    border-radius:6px;
    padding:8px 13px;
    font-weight:600;
}

.btn-primary{background:var(--blue);color:#fff}
.btn-primary:hover{background:var(--blue-dark)}
.btn-secondary{background:#e9eef3;color:#334155}
.btn-success{background:var(--green);color:#fff}
.btn-danger{background:var(--red);color:#fff}
.btn-warning{background:var(--orange);color:#fff}
.btn-purple{background:var(--purple);color:#fff}
.btn-sm{padding:5px 9px;font-size:11px}

.actions{display:flex;gap:7px;flex-wrap:wrap;align-items:center}

.auth-wrap{max-width:1050px;margin:45px auto;padding:15px}

.auth-box{
    background:#fff;
    border-radius:12px;
    box-shadow:0 8px 30px #12345618;
    border:1px solid var(--border);
    overflow:hidden;
}

.auth-head{
    background:linear-gradient(135deg,var(--blue-dark),var(--blue));
    color:#fff;
    padding:28px;
    text-align:center;
}

.auth-head h1{margin:0 0 7px;font-size:20px}
.auth-head p{margin:0;opacity:.9}

.tabs{display:flex;border-bottom:1px solid var(--border);background:#fafcff}

.tab{
    flex:1;
    border:0;
    background:transparent;
    padding:12px;
    color:#64748b;
    font-weight:600;
}

.tab.active{
    color:var(--blue);
    background:#fff;
    border-bottom:2px solid var(--blue);
}

.auth-content{padding:22px}

.alert{
    padding:10px 12px;
    border-radius:7px;
    margin-bottom:12px;
    border:1px solid transparent;
}

.alert-info{background:#edf6fd;border-color:#cce4f8;color:#15557f}
.alert-success{background:#edf9f2;border-color:#ccebd9;color:#166534}
.alert-danger{background:#fff1f1;border-color:#f4caca;color:#991b1b}
.alert-warning{background:#fff8e8;border-color:#f3df9b;color:#7a5a00}

.dashboard-header{
    display:flex;
    justify-content:space-between;
    align-items:center;
    gap:10px;
    margin-bottom:16px;
}

.user-info{display:flex;align-items:center;gap:10px}

.avatar{
    width:38px;
    height:38px;
    border-radius:50%;
    background:var(--blue-light);
    color:var(--blue);
    display:flex;
    justify-content:center;
    align-items:center;
    font-weight:700;
}

.stats{
    display:grid;
    grid-template-columns:repeat(4,1fr);
    gap:10px;
    margin-bottom:16px;
}

.stat{
    background:#fff;
    border:1px solid var(--border);
    border-radius:9px;
    padding:14px;
}

.stat-title{color:#64748b;font-size:11px}
.stat-number{font-size:22px;font-weight:700;color:var(--blue-dark);margin-top:4px}

.form-section{
    border:1px solid var(--border);
    border-radius:9px;
    margin-bottom:12px;
    overflow:hidden;
}

.form-section-title{
    background:#f7fafc;
    color:var(--blue-dark);
    font-weight:700;
    padding:9px 12px;
    border-bottom:1px solid var(--border);
    display:flex;
    justify-content:space-between;
    align-items:center;
}

.form-section-body{padding:12px}

.badge{
    display:inline-block;
    padding:4px 8px;
    border-radius:20px;
    font-size:10px;
    font-weight:600;
}

.badge-blue{background:#e7f2fb;color:#1261a0}
.badge-green{background:#e6f7ee;color:#168653}
.badge-orange{background:#fff4df;color:#a55c00}
.badge-red{background:#ffebeb;color:#b42323}
.badge-gray{background:#edf0f3;color:#64748b}

.table-wrap{overflow:auto}

table{
    width:100%;
    border-collapse:collapse;
    min-width:950px;
}

th,td{
    padding:9px 8px;
    border-bottom:1px solid #e5eaf0;
    text-align:right;
    white-space:nowrap;
}

th{background:#f5f8fb;color:#334155;font-weight:700}
tr:hover td{background:#fafcff}

.empty{text-align:center;color:#94a3b8;padding:30px}

.modal{
    position:fixed;
    inset:0;
    background:#0008;
    display:flex;
    align-items:center;
    justify-content:center;
    z-index:1000;
    padding:15px;
}

.modal-box{
    width:min(1100px,100%);
    max-height:94vh;
    overflow:auto;
    background:#fff;
    border-radius:10px;
    box-shadow:0 15px 50px #0005;
}

.modal-header{
    padding:13px 16px;
    border-bottom:1px solid var(--border);
    display:flex;
    justify-content:space-between;
    align-items:center;
}

.modal-header h3{margin:0;color:var(--blue-dark)}

.modal-body{padding:16px}

.close{
    background:#f1f5f9;
    border:0;
    width:30px;
    height:30px;
    border-radius:50%;
    font-size:18px;
}

.progress{display:flex;gap:3px;margin:15px 0}

.progress-step{
    flex:1;
    height:7px;
    background:#dce4eb;
    border-radius:10px;
}

.progress-step.active{background:var(--blue)}
.progress-step.done{background:var(--green)}

.file-box{
    border:1px dashed #b7c5d2;
    background:#f9fbfd;
    padding:10px;
    border-radius:7px;
}

.file-box input{border:0;padding:3px;background:transparent}

.note{
    background:#fff9e8;
    border:1px solid #f3df9b;
    padding:8px 10px;
    border-radius:6px;
    color:#7a5a00;
    margin-top:8px;
}

.timeline{position:relative;padding-right:20px}

.timeline:before{
    content:"";
    position:absolute;
    right:5px;
    top:5px;
    bottom:5px;
    width:2px;
    background:#dce5ed;
}

.timeline-item{
    position:relative;
    padding:5px 18px 15px 0;
}

.timeline-item:before{
    content:"";
    position:absolute;
    right:0;
    top:7px;
    width:10px;
    height:10px;
    border-radius:50%;
    background:#cbd5e1;
    border:2px solid #fff;
    box-shadow:0 0 0 1px #cbd5e1;
}

.timeline-item.active:before{
    background:var(--blue);
    box-shadow:0 0 0 1px var(--blue);
}

.timeline-item strong{display:block;color:#334155}
.timeline-item small{color:#94a3b8}

.search-box{display:flex;gap:7px;margin-bottom:12px}
.search-box input{flex:1}

.lang-switch{
    display:flex;
    gap:4px;
    background:#eef3f7;
    padding:3px;
    border-radius:7px;
}

.lang-switch button{
    border:0;
    padding:5px 10px;
    border-radius:5px;
    background:transparent;
}

.lang-switch button.active{
    background:#fff;
    color:var(--blue);
    font-weight:700;
    box-shadow:0 1px 4px #0001;
}

.bilingual{
    display:grid;
    grid-template-columns:1fr 1fr;
    gap:8px;
}

.bilingual .fa-title{
    font-weight:600;
}

.bilingual .en-title{
    direction:ltr;
    text-align:left;
    font-weight:600;
}

.bilingual input,
.bilingual select,
.bilingual textarea{
    width:100%;
}

.app-code-box{
    background:#eef7ff;
    border:1px solid #c7e2f8;
    border-radius:8px;
    padding:10px;
}

.app-code{
    direction:ltr;
    font-family:Consolas,monospace;
    font-size:16px;
    font-weight:700;
    color:var(--blue-dark);
    letter-spacing:1px;
}

.event-box{
    background:#f8fafc;
    border:1px solid var(--border);
    border-radius:7px;
    padding:9px;
    margin-top:7px;
}

.event-box b{color:var(--blue-dark)}

.sms-status{
    display:flex;
    align-items:center;
    gap:7px;
}

.switch{
    position:relative;
    width:45px;
    height:23px;
}

.switch input{display:none}

.slider{
    position:absolute;
    inset:0;
    background:#cbd5e1;
    border-radius:20px;
}

.slider:before{
    content:"";
    position:absolute;
    width:17px;
    height:17px;
    left:3px;
    top:3px;
    background:white;
    border-radius:50%;
    transition:.2s;
}

.switch input:checked + .slider{background:var(--green)}
.switch input:checked + .slider:before{transform:translateX(22px)}

.footer{
    text-align:center;
    color:#94a3b8;
    padding:25px;
    font-size:10px;
}

@media(max-width:800px){
    .grid{grid-template-columns:repeat(2,1fr)}
    .col-12,.col-9,.col-8,.col-6,.col-4,.col-3{grid-column:span 2}
    .stats{grid-template-columns:repeat(2,1fr)}
    .bilingual{grid-template-columns:1fr}
    .topbar{padding:0 12px}
}

@media(max-width:500px){
    .stats{grid-template-columns:1fr 1fr}
    .auth-wrap{margin:15px auto}
    .auth-content{padding:14px}
}
</style>
</head>

<body>

<!-- =====================================================
     LOGIN
===================================================== -->
<div id="loginPage">

<div class="auth-wrap">
<div class="auth-box">

<div class="auth-head">
<h1>سامانه مدیریت ویزای الکترونیکی روسیه</h1>
<p>Russia E-Visa Management System</p>
</div>

<div class="tabs">
<button class="tab active" onclick="showLogin('passenger')">ورود مسافر / Passenger</button>
<button class="tab" onclick="showLogin('agency')">ورود طرف تجاری / Partner</button>
<button class="tab" onclick="showLogin('admin')">مدیریت کل / Super Admin</button>
</div>

<div class="auth-content">

<div id="login-passenger">

<div class="grid">

<div class="col-6">
<label>شماره موبایل / Mobile</label>
<input id="plMobile" placeholder="0912xxxxxxx">
</div>

<div class="col-6">
<label>رمز عبور / Password</label>
<input id="plPassword" type="password">
</div>

<div class="col-12 actions">
<button class="btn btn-primary" onclick="passengerLogin()">ورود / Login</button>
<button class="btn btn-secondary" onclick="showRegister('passenger')">ثبت نام مسافر / Register</button>
<button class="btn btn-secondary" onclick="trackGuest()">پیگیری بدون ورود / Track</button>
</div>

</div>
</div>


<div id="login-agency" class="hidden">

<div class="grid">

<div class="col-4">
<label>کد شناسه طرف تجاری / Partner ID</label>
<input id="alCode" maxlength="5" inputmode="numeric">
</div>

<div class="col-4">
<label>شماره موبایل / Mobile</label>
<input id="alMobile">
</div>

<div class="col-4">
<label>رمز عبور / Password</label>
<input id="alPassword" type="password">
</div>

<div class="col-12 actions">
<button class="btn btn-primary" onclick="agencyLogin()">ورود</button>
<button class="btn btn-secondary" onclick="showRegister('agency')">ثبت نام طرف تجاری</button>
</div>

</div>
</div>


<div id="login-admin" class="hidden">

<div class="grid">

<div class="col-6">
<label>نام کاربری</label>
<input id="adminUser">
</div>

<div class="col-6">
<label>رمز عبور</label>
<input id="adminPass" type="password">
</div>

<div class="col-12">
<button class="btn btn-primary" onclick="adminLogin()">ورود مدیریت کل</button>
</div>

</div>

</div>

<div id="authMessage" class="hidden"></div>

</div>
</div>
</div>
</div>


<!-- =====================================================
     REGISTER
===================================================== -->
<div id="registerModal" class="modal hidden">

<div class="modal-box">

<div class="modal-header">
<h3 id="registerTitle">ثبت نام</h3>
<button class="close" onclick="closeModal('registerModal')">×</button>
</div>

<div class="modal-body">

<div id="passengerRegister">

<div class="alert alert-info">
برای ثبت فرم، کد شناسه ۵ رقمی طرف تجاری / آژانس خود را از آژانس دریافت کنید.
</div>

<div class="grid">

<div class="col-6">
<label>نام / First Name *</label>
<input id="rgPFirst">
</div>

<div class="col-6">
<label>نام خانوادگی / Surname *</label>
<input id="rgPLast">
</div>

<div class="col-6">
<label>شماره موبایل / Mobile *</label>
<input id="rgPMobile">
</div>

<div class="col-6">
<label>کد شناسه آژانس / Agency ID *</label>
<input id="rgAgencyCode" maxlength="5" inputmode="numeric">
</div>

<div class="col-6">
<label>رمز عبور / Password *</label>
<input id="rgPPassword" type="password">
</div>

<div class="col-6">
<label>تکرار رمز / Confirm Password</label>
<input id="rgPPassword2" type="password">
</div>

</div>

<div class="actions" style="margin-top:14px">
<button class="btn btn-primary" onclick="registerPassenger()">ایجاد حساب / Create Account</button>
</div>

</div>


<div id="agencyRegister" class="hidden">

<div class="grid">

<div class="col-6">
<label>نام آژانس / شرکت *</label>
<input id="rgAName">
</div>

<div class="col-6">
<label>نام مدیر / مسئول</label>
<input id="rgAManager">
</div>

<div class="col-6">
<label>شماره موبایل *</label>
<input id="rgAMobile">
</div>

<div class="col-6">
<label>ایمیل</label>
<input id="rgAEmail">
</div>

<div class="col-6">
<label>رمز عبور *</label>
<input id="rgAPassword" type="password">
</div>

<div class="col-12">
<label>آدرس</label>
<textarea id="rgAAddress"></textarea>
</div>

</div>

<div class="actions" style="margin-top:14px">
<button class="btn btn-primary" onclick="registerAgency()">ثبت نام و دریافت کد شناسه</button>
</div>

</div>

</div>
</div>
</div>


<!-- =====================================================
     APPLICATION MODAL
===================================================== -->
<div id="applicationModal" class="modal hidden">

<div class="modal-box">

<div class="modal-header">

<h3>
فرم درخواست ویزای الکترونیکی روسیه /
Russia E-Visa Application
</h3>

<div class="actions">

<div class="lang-switch">
<button id="langFA" class="active" onclick="setFormLanguage('fa')">فارسی</button>
<button id="langEN" onclick="setFormLanguage('en')">English</button>
</div>

<button class="close" onclick="closeModal('applicationModal')">×</button>

</div>

</div>

<div class="modal-body">

<div class="alert alert-info">
<strong>نکته / Important:</strong>
فرم به صورت دو زبانه طراحی شده است. تاریخ‌ها به صورت میلادی وارد شوند.
</div>

<div class="app-code-box" style="margin-bottom:12px">

<div class="grid">

<div class="col-6">

<label>
شماره اپلیکیشن /
Application Number
</label>

<input id="applicationNo" readonly>

<small>
شماره اپلیکیشن به صورت خودکار شامل تاریخ، ساعت، دقیقه و رقم تصادفی تولید می‌شود.
</small>

</div>

<div class="col-6">

<label>
کد شناسه طرف تجاری /
Partner Agency ID
</label>

<input id="applicationAgencyCode" readonly>

</div>

</div>

</div>


<input type="hidden" id="editCaseId">


<!-- 1 -->
<div class="form-section">

<div class="form-section-title">
<span>
۱. اطلاعات درخواست و پاسپورت /
1. Application & Passport Information
</span>
</div>

<div class="form-section-body">

<div class="grid">

<div class="col-4">
<label>شماره پاسپورت / Passport Number *</label>
<input id="passportNo">
</div>

<div class="col-4">
<label>کد ملی / National ID</label>
<input id="nationalId">
</div>

<div class="col-4">
<label>جنسیت / Gender</label>
<select id="gender">
<option value="">انتخاب / Select</option>
<option>مرد / Male</option>
<option>زن / Female</option>
</select>
</div>

<div class="col-6">
<label>نام / Given Name *</label>
<input id="givenName">
</div>

<div class="col-6">
<label>نام خانوادگی / Surname *</label>
<input id="surname">
</div>

<div class="col-4">
<label>تاریخ صدور / Date of Issue</label>
<input id="passportIssue" type="date">
</div>

<div class="col-4">
<label>تاریخ انقضا / Date of Expiry</label>
<input id="passportExpiry" type="date">
</div>

<div class="col-4">
<label>تاریخ ورود به روسیه / Intended Entry Date</label>
<input id="russiaEntryDate" type="date">
</div>

<div class="col-12">
<label>سابقه سفر در ۳ سال گذشته / Travel History - Last 3 Years</label>
<input id="travelHistory">
</div>

</div>

</div>
</div>


<!-- 2 -->
<div class="form-section">

<div class="form-section-title">
<span>۲. اطلاعات والدین / 2. Parents Information</span>
</div>

<div class="form-section-body">

<div class="grid">

<div class="col-3">
<label>نام خانوادگی پدر / Father's Surname</label>
<input id="fatherSurname">
</div>

<div class="col-3">
<label>نام پدر / Father's Name</label>
<input id="fatherName">
</div>

<div class="col-3">
<label>تولد پدر / Father's DOB</label>
<input id="fatherDob" type="date">
</div>

<div class="col-3">
<label>محل تولد پدر / Birthplace</label>
<input id="fatherBirthplace">
</div>

<div class="col-3">
<label>نام خانوادگی مادر / Mother's Surname</label>
<input id="motherSurname">
</div>

<div class="col-3">
<label>نام مادر / Mother's Name</label>
<input id="motherName">
</div>

<div class="col-3">
<label>تولد مادر / Mother's DOB</label>
<input id="motherDob" type="date">
</div>

<div class="col-3">
<label>محل تولد مادر / Birthplace</label>
<input id="motherBirthplace">
</div>

</div>

</div>
</div>


<!-- 3 -->
<div class="form-section">

<div class="form-section-title">
<span>۳. خدمت نظام وظیفه / 3. Military Service</span>
</div>

<div class="form-section-body">

<div class="note">
در صورت معافیت یا نداشتن خدمت، این قسمت خالی بماند /
Leave blank if exempt or no military service.
</div>

<div class="grid" style="margin-top:10px">

<div class="col-3">
<label>شروع خدمت / Start Date</label>
<input id="militaryStart" type="date">
</div>

<div class="col-3">
<label>پایان خدمت / End Date</label>
<input id="militaryEnd" type="date">
</div>

<div class="col-3">
<label>نیرو / Branch</label>
<input id="militaryBranch">
</div>

<div class="col-3">
<label>محل خدمت / Place</label>
<input id="militaryPlace">
</div>

</div>

</div>
</div>


<!-- 4 -->
<div class="form-section">

<div class="form-section-title">
<span>۴. محل سکونت و تماس / 4. Residence & Contact</span>
</div>

<div class="form-section-body">

<div class="grid">

<div class="col-8">
<label>آدرس / Address</label>
<textarea id="residenceAddress"></textarea>
</div>

<div class="col-4">
<label>تلفن / Phone</label>
<input id="residencePhone">
</div>

<div class="col-6">
<label>ایمیل شخصی / Personal Email</label>
<input id="personalEmail" type="email">
</div>

</div>

</div>
</div>


<!-- 5 -->
<div class="form-section">

<div class="form-section-title">
<span>۵. شغل / تحصیل / 5. Employment & Education</span>
</div>

<div class="form-section-body">

<div class="grid">

<div class="col-6">
<label>عنوان شغلی / تحصیلی / Occupation</label>
<input id="jobTitle">
</div>

<div class="col-6">
<label>نام محل کار / تحصیل / Organization</label>
<input id="jobPlace">
</div>

<div class="col-6">
<label>آدرس / Address</label>
<textarea id="jobAddress"></textarea>
</div>

<div class="col-3">
<label>تلفن / Phone</label>
<input id="jobPhone">
</div>

<div class="col-3">
<label>ایمیل / Email</label>
<input id="jobEmail">
</div>

</div>

</div>
</div>


<!-- 6 -->
<div class="form-section">

<div class="form-section-title">
<span>۶. وضعیت تأهل / 6. Marital Status</span>
</div>

<div class="form-section-body">

<div class="grid">

<div class="col-3">
<label>متأهل؟ / Married?</label>
<select id="married" onchange="toggleBlock('spouseBlock',this.value.includes('بله'))">
<option value="">انتخاب / Select</option>
<option value="بله / Yes">بله / Yes</option>
<option value="خیر / No">خیر / No</option>
</select>
</div>

</div>

<div id="spouseBlock" class="grid hidden" style="margin-top:10px">

<div class="col-3">
<label>نام / First Name</label>
<input id="spouseName">
</div>

<div class="col-3">
<label>نام خانوادگی / Surname</label>
<input id="spouseSurname">
</div>

<div class="col-3">
<label>تاریخ تولد / DOB</label>
<input id="spouseDob" type="date">
</div>

<div class="col-3">
<label>محل تولد / Birthplace</label>
<input id="spouseBirthplace">
</div>

</div>

</div>
</div>


<!-- 7 -->
<div class="form-section">

<div class="form-section-title">
<span>۷. بستگان / دوستان در روسیه / 7. Relatives & Friends in Russia</span>
</div>

<div class="form-section-body">

<div class="grid">

<div class="col-3">
<label>شخصی در روسیه دارید؟ / Have any?</label>
<select id="russiaRelative" onchange="toggleBlock('relativeBlock',this.value.includes('بله'))">
<option value="">انتخاب / Select</option>
<option value="بله / Yes">بله / Yes</option>
<option value="خیر / No">خیر / No</option>
</select>
</div>

</div>

<div id="relativeBlock" class="grid hidden" style="margin-top:10px">

<div class="col-3">
<label>نسبت / Relation</label>
<input id="relativeRelation">
</div>

<div class="col-3">
<label>نام / First Name</label>
<input id="relativeName">
</div>

<div class="col-3">
<label>نام خانوادگی / Surname</label>
<input id="relativeSurname">
</div>

<div class="col-3">
<label>تاریخ تولد / DOB</label>
<input id="relativeDob" type="date">
</div>

<div class="col-3">
<label>جنسیت / Gender</label>
<select id="relativeGender">
<option value="">انتخاب / Select</option>
<option>مرد / Male</option>
<option>زن / Female</option>
</select>
</div>

<div class="col-6">
<label>آدرس / Address</label>
<textarea id="relativeAddress"></textarea>
</div>

<div class="col-3">
<label>تلفن / Phone</label>
<input id="relativePhone">
</div>

</div>

</div>
</div>


<!-- 8 -->
<div class="form-section">

<div class="form-section-title">
<span>۸. تحصیلات عالی / 8. Higher Education</span>
</div>

<div class="form-section-body">

<div class="grid">

<div class="col-3">
<label>تحصیلات عالی؟ / Higher Education?</label>
<select id="higherEducation" onchange="toggleBlock('educationBlock',this.value.includes('بله'))">
<option value="">انتخاب / Select</option>
<option value="بله / Yes">بله / Yes</option>
<option value="خیر / No">خیر / No</option>
</select>
</div>

</div>

<div id="educationBlock" class="grid hidden" style="margin-top:10px">

<div class="col-6">
<label>نام دانشگاه / مؤسسه / Organization</label>
<input id="educationOrg">
</div>

<div class="col-6">
<label>آدرس / Address</label>
<input id="educationAddress">
</div>

</div>

</div>
</div>


<!-- 9 -->
<div class="form-section">

<div class="form-section-title">
<span>۹. سازمان / شخص مورد بازدید / 9. Russian Host</span>
</div>

<div class="form-section-body">

<div class="grid">

<div class="col-6">
<label>نام / Name</label>
<input id="visitName">
</div>

<div class="col-6">
<label>شهر / City</label>
<input id="visitCity">
</div>

<div class="col-6">
<label>آدرس / Address</label>
<textarea id="visitAddress"></textarea>
</div>

<div class="col-3">
<label>تلفن / Phone</label>
<input id="visitPhone">
</div>

<div class="col-3">
<label>ایمیل / Email</label>
<input id="visitEmail">
</div>

</div>

</div>
</div>


<!-- 10 -->
<div class="form-section">

<div class="form-section-title">
<span>۱۰. مدارک / 10. Documents</span>
</div>

<div class="form-section-body">

<div class="grid">

<div class="col-6">
<label>عکس پرسنلی / Photo</label>
<div class="file-box">
<input id="photoFile" type="file" accept="image/*">
</div>
</div>

<div class="col-6">
<label>پاسپورت / Passport</label>
<div class="file-box">
<input id="passportFile" type="file" accept="image/*,.pdf">
</div>
</div>

</div>

<div class="note">
نام فایل‌ها بهتر است انگلیسی باشد؛ مانند photo.jpg یا passport.pdf
</div>

</div>
</div>


<div class="actions" style="justify-content:flex-end">

<button type="button" class="btn btn-secondary"
onclick="closeModal('applicationModal')">
انصراف / Cancel
</button>

<button type="button" class="btn btn-primary"
onclick="saveApplication()">
ثبت درخواست / Submit Application
</button>

</div>

</div>
</div>
</div>


<!-- =====================================================
     APP
===================================================== -->
<div id="appPage" class="hidden">

<div class="topbar">

<div class="brand">
سامانه مدیریت ویزای الکترونیکی روسیه
<small>Russia E-Visa Management System — V3</small>
</div>

<div class="top-actions">
<span id="topUser"></span>
<button class="btn btn-secondary btn-sm" onclick="logout()">خروج / Logout</button>
</div>

</div>

<div class="container">


<!-- PASSENGER -->
<div id="passengerDashboard" class="hidden">

<div class="dashboard-header">

<div class="user-info">

<div class="avatar" id="passengerAvatar">م</div>

<div>
<strong id="passengerName"></strong>
<div style="color:#64748b">
کد شناسه آژانس / Agency ID:
<b id="passengerAgency"></b>
</div>
</div>

</div>

<button class="btn btn-primary" onclick="openNewApplication()">
+ ثبت فرم جدید / New Application
</button>

</div>


<div class="card">

<div class="card-body">

<div class="alert alert-info">

<strong>
قبل از ثبت فرم:
</strong>

کد شناسه ۵ رقمی آژانس / طرف تجاری خود را از آژانس دریافت و در حساب خود ثبت کنید.

</div>

<div class="grid">

<div class="col-6">

<label>
کد شناسه آژانس شما /
Your Agency Partner ID
</label>

<input id="passengerAgencyCodeView" readonly>

</div>

<div class="col-6">

<label>
شماره موبایل /
Mobile
</label>

<input id="passengerMobileView" readonly>

</div>

</div>

</div>
</div>


<div class="stats">

<div class="stat">
<div class="stat-title">کل درخواست‌ها / Total</div>
<div class="stat-number" id="pStatTotal">0</div>
</div>

<div class="stat">
<div class="stat-title">در حال بررسی / Processing</div>
<div class="stat-number" id="pStatPending">0</div>
</div>

<div class="stat">
<div class="stat-title">ویزا صادر شده / Issued</div>
<div class="stat-number" id="pStatIssued">0</div>
</div>

<div class="stat">
<div class="stat-title">نقص مدارک / Incomplete</div>
<div class="stat-number" id="pStatIncomplete">0</div>
</div>

</div>


<div class="card">

<div class="card-header">
<h3>پرونده‌های من / My Applications</h3>
<button class="btn btn-primary btn-sm" onclick="openNewApplication()">فرم جدید</button>
</div>

<div class="card-body">
<div id="passengerCases"></div>
</div>

</div>

</div>


<!-- AGENCY -->
<div id="agencyDashboard" class="hidden">

<div class="dashboard-header">

<div class="user-info">

<div class="avatar">P</div>

<div>
<strong id="agencyNameTitle"></strong>
<div>
کد شناسه:
<b id="agencyCodeTitle"></b>
</div>
</div>

</div>

<button class="btn btn-primary" onclick="openNewApplication()">
+ ثبت فرم جدید مسافر
</button>

</div>


<div class="stats">

<div class="stat">
<div class="stat-title">کل پرونده‌ها</div>
<div class="stat-number" id="aTotal">0</div>
</div>

<div class="stat">
<div class="stat-title">در حال بررسی</div>
<div class="stat-number" id="aPending">0</div>
</div>

<div class="stat">
<div class="stat-title">ویزا صادر شده</div>
<div class="stat-number" id="aIssued">0</div>
</div>

<div class="stat">
<div class="stat-title">نقص مدارک</div>
<div class="stat-number" id="aIncomplete">0</div>
</div>

</div>


<div class="card">

<div class="card-header">
<h3>پرونده‌های مسافران این طرف تجاری</h3>
</div>

<div class="card-body">

<div class="search-box">
<input id="agencySearch"
placeholder="کد رهگیری، شماره اپلیکیشن، نام، پاسپورت یا موبایل"
oninput="renderAgencyCases()">
</div>

<div id="agencyCases"></div>

</div>
</div>

</div>


<!-- ADMIN -->
<div id="adminDashboard" class="hidden">

<div class="dashboard-header">

<div>
<h2 style="margin:0;color:var(--blue-dark);font-size:17px">
مدیریت کل سامانه / Super Admin
</h2>
<small>مشاهده همه طرف‌های تجاری و همه پرونده‌ها</small>
</div>

<div class="actions">
<button class="btn btn-purple" onclick="openSMSSettings()">
تنظیمات SMS
</button>

<button class="btn btn-primary" onclick="openNewApplication()">
+ ثبت پرونده
</button>
</div>

</div>


<div class="stats">

<div class="stat">
<div class="stat-title">کل پرونده‌ها</div>
<div class="stat-number" id="adminTotal">0</div>
</div>

<div class="stat">
<div class="stat-title">طرف‌های تجاری</div>
<div class="stat-number" id="adminAgencies">0</div>
</div>

<div class="stat">
<div class="stat-title">مسافران</div>
<div class="stat-number" id="adminPassengers">0</div>
</div>

<div class="stat">
<div class="stat-title">ویزای صادر شده</div>
<div class="stat-number" id="adminIssued">0</div>
</div>

</div>


<div class="card">

<div class="card-header">

<h3>همه پرونده‌ها / All Applications</h3>

<select id="adminStatusFilter" onchange="renderAdminCases()">
<option value="">همه وضعیت‌ها / All</option>
<option>ثبت اولیه / Initial</option>
<option>در حال بررسی / Under Review</option>
<option>نقص مدارک / Documents Required</option>
<option>تکمیل مدارک / Documents Completed</option>
<option>ارسال شده / Submitted</option>
<option>ویزا صادر شد / Visa Issued</option>
<option>رد شد / Rejected</option>
</select>

</div>

<div class="card-body">

<div class="search-box">
<input id="adminSearch"
placeholder="جستجو با کد رهگیری، شماره اپلیکیشن، نام، موبایل یا پاسپورت"
oninput="renderAdminCases()">
</div>

<div id="adminCases"></div>

</div>
</div>


<div class="card">

<div class="card-header">
<h3>طرف‌های تجاری / Commercial Partners</h3>
</div>

<div class="card-body">
<div id="agencyList"></div>
</div>

</div>


<div class="card">

<div class="card-header">
<h3>گزارش اکشن‌ها / Activity Log</h3>
</div>

<div class="card-body">
<div id="activityLog"></div>
</div>

</div>

</div>


<div class="footer">
Russia E-Visa Management System — Version 3
</div>

</div>
</div>


<!-- =====================================================
     CASE MODAL
===================================================== -->
<div id="caseModal" class="modal hidden">

<div class="modal-box">

<div class="modal-header">
<h3>جزئیات پرونده / Case Details</h3>
<button class="close" onclick="closeModal('caseModal')">×</button>
</div>

<div class="modal-body" id="caseDetails"></div>

</div>
</div>


<!-- =====================================================
     SMS SETTINGS
===================================================== -->
<div id="smsModal" class="modal hidden">

<div class="modal-box">

<div class="modal-header">

<h3>
تنظیمات پیامک / SMS Gateway Settings
</h3>

<button class="close" onclick="closeModal('smsModal')">×</button>

</div>

<div class="modal-body">

<div class="alert alert-warning">
این بخش برای اتصال به پنل پیامکی ساخته شده است.
در نسخه واقعی PHP باید اطلاعات زیر در سمت سرور ذخیره شوند و API Key نباید داخل HTML عمومی قرار بگیرد.
</div>

<div class="grid">

<div class="col-12">

<div class="sms-status">

<label style="margin:0">فعال کردن سیستم پیامک / Enable SMS</label>

<label class="switch">

<input type="checkbox" id="smsEnabled">

<span class="slider"></span>

</label>

</div>

</div>


<div class="col-6">
<label>نام سرویس‌دهنده / Provider</label>
<select id="smsProvider">
<option value="melipayamak">ملی پیامک / Melipayamak</option>
<option value="ippanel">IPPanel</option>
<option value="kavenegar">کاوه نگار / Kavenegar</option>
<option value="farapayamak">فراپیامک / FaraPayamak</option>
<option value="other">سایر / Other</option>
</select>
</div>


<div class="col-6">
<label>نام کاربری / Username</label>
<input id="smsUsername">
</div>


<div class="col-6">
<label>رمز عبور / Password</label>
<input id="smsPassword" type="password">
</div>


<div class="col-6">
<label>API Key / Token</label>
<input id="smsApiKey" type="password">
</div>


<div class="col-6">
<label>شماره فرستنده / Sender Number</label>
<input id="smsSender">
</div>


<div class="col-6">
<label>شماره پشتیبانی / Support Number</label>
<input id="smsSupport">
</div>


<div class="col-12">
<label>آدرس API / API Endpoint</label>
<input id="smsEndpoint"
placeholder="https://api.example.com/...">
</div>


<div class="col-12">
<label>الگوی پیامک / Template ID</label>
<input id="smsTemplateId"
placeholder="مثلاً 12345">
</div>


<div class="col-12">
<label>متن پیام پیش‌فرض / Default Message</label>
<textarea id="smsMessageTemplate">کد شناسه طرف تجاری شما: {AGENCY_CODE}</textarea>
</div>

</div>


<div class="note">

پارامترهایی که معمولاً از پنل پیامکی نیاز دارید:

<br>
1. API Key یا Token
<br>
2. Username در صورت نیاز
<br>
3. Password در صورت نیاز
<br>
4. Sender Number
<br>
5. API Endpoint
<br>
6. Template ID / Pattern ID در صورت استفاده از پیامک الگو
<br>
7. پارامترهای متغیر الگو مانند {AGENCY_CODE}

</div>


<div class="actions" style="margin-top:15px">

<button class="btn btn-primary" onclick="saveSMSSettings()">
ذخیره تنظیمات
</button>

<button class="btn btn-secondary" onclick="testSMS()">
تست زیرساخت پیامک
</button>

</div>

</div>
</div>
</div>


<script>

/* =====================================================
   EVISA-RU-PRO-V3
===================================================== */

const DB_KEY="EVISA_RU_PRO_V3_DB";
const SMS_KEY="EVISA_RU_SMS_V3";

const ADMIN_USER="09301046779";
const ADMIN_PASS="09301046779";

let currentUser=null;

let db=loadDB();

const STATUS_LIST=[
    "ثبت اولیه / Initial",
    "در حال بررسی / Under Review",
    "نقص مدارک / Documents Required",
    "تکمیل مدارک / Documents Completed",
    "ارسال شده / Submitted",
    "ویزا صادر شد / Visa Issued",
    "رد شد / Rejected"
];

const FORM_FIELDS=[
"passportNo","nationalId","gender","givenName","surname",
"passportIssue","passportExpiry","russiaEntryDate","travelHistory",
"fatherSurname","fatherName","fatherDob","fatherBirthplace",
"motherSurname","motherName","motherDob","motherBirthplace",
"militaryStart","militaryEnd","militaryBranch","militaryPlace",
"residenceAddress","residencePhone","personalEmail",
"jobTitle","jobPlace","jobAddress","jobPhone","jobEmail",
"married","spouseName","spouseSurname","spouseDob","spouseBirthplace",
"russiaRelative","relativeRelation","relativeName","relativeSurname",
"relativeDob","relativeGender","relativeAddress","relativePhone",
"higherEducation","educationOrg","educationAddress",
"visitName","visitCity","visitAddress","visitPhone","visitEmail"
];

function loadDB(){

    try{

        const x=localStorage.getItem(DB_KEY);

        if(x){

            const d=JSON.parse(x);

            if(!d.passengers)d.passengers=[];
            if(!d.agencies)d.agencies=[];
            if(!d.cases)d.cases=[];
            if(!d.activities)d.activities=[];

            return d;
        }

    }catch(e){}

    return {
        passengers:[],
        agencies:[],
        cases:[],
        activities:[]
    };
}

function saveDB(){
    localStorage.setItem(DB_KEY,JSON.stringify(db));
}

function uid(prefix){

    return prefix+"-"+Date.now().toString(36).toUpperCase()+
        "-"+Math.random().toString(36).substring(2,7).toUpperCase();

}

function esc(v){

    if(v===null||v===undefined)return "";

    return String(v)
    .replaceAll("&","&amp;")
    .replaceAll("<","&lt;")
    .replaceAll(">","&gt;")
    .replaceAll('"',"&quot;")
    .replaceAll("'","&#039;");

}


/* =====================================================
   APPLICATION NUMBER
   Gregorian YYYYMMDDHHMM + 5 RANDOM DIGITS
===================================================== */

function generateApplicationNumber(){

    const d=new Date();

    const y=d.getFullYear();
    const m=String(d.getMonth()+1).padStart(2,"0");
    const day=String(d.getDate()).padStart(2,"0");
    const h=String(d.getHours()).padStart(2,"0");
    const min=String(d.getMinutes()).padStart(2,"0");

    let random;

    do{

        random=String(
            Math.floor(10000+Math.random()*90000)
        );

    }while(db.cases.some(c=>c.applicationNo===`EV${y}${m}${day}${h}${min}${random}`));

    return `EV${y}${m}${day}${h}${min}${random}`;

}


/* =====================================================
   TRACKING NUMBER
===================================================== */

function trackingNumber(){

    let x;

    do{

        x="RU-"+Math.floor(10000000+Math.random()*90000000);

    }while(db.cases.some(c=>c.tracking===x));

    return x;
}


/* =====================================================
   AGENCY CODE
===================================================== */

function agencyCode(){

    let code;

    do{

        code=String(Math.floor(10000+Math.random()*90000));

    }while(db.agencies.some(a=>a.code===code));

    return code;
}


/* =====================================================
   ACTIVITY LOG
===================================================== */

function logActivity(action,caseObj,actor){

    db.activities.unshift({

        id:uid("LOG"),

        date:new Date().toISOString(),

        actor:actor || "SYSTEM",

        role:currentUser?.role || "system",

        action,

        tracking:caseObj?.tracking || "",

        applicationNo:caseObj?.applicationNo || "",

        owner:caseObj?.ownerName || "",

        agencyCode:caseObj?.agencyCode || ""

    });

    if(db.activities.length>500)
        db.activities=db.activities.slice(0,500);

    saveDB();

}


/* =====================================================
   LOGIN UI
===================================================== */

function showLogin(type){

    document.querySelectorAll(".tab")
        .forEach(x=>x.classList.remove("active"));

    const tabs=document.querySelectorAll(".tab");

    if(type==="passenger")tabs[0].classList.add("active");
    if(type==="agency")tabs[1].classList.add("active");
    if(type==="admin")tabs[2].classList.add("active");

    document.getElementById("login-passenger")
        .classList.toggle("hidden",type!=="passenger");

    document.getElementById("login-agency")
        .classList.toggle("hidden",type!=="agency");

    document.getElementById("login-admin")
        .classList.toggle("hidden",type!=="admin");

}

function showMessage(text,type="info"){

    const box=document.getElementById("authMessage");

    box.className="alert alert-"+type;
    box.innerHTML=text;
    box.classList.remove("hidden");

}

function showRegister(type){

    document.getElementById("registerModal")
        .classList.remove("hidden");

    document.getElementById("passengerRegister")
        .classList.toggle("hidden",type!=="passenger");

    document.getElementById("agencyRegister")
        .classList.toggle("hidden",type!=="agency");

    document.getElementById("registerTitle").textContent=
        type==="passenger"
        ?"ثبت نام مسافر / Passenger Registration"
        :"ثبت نام طرف تجاری / Partner Registration";

}

function closeModal(id){
    document.getElementById(id).classList.add("hidden");
}

function toggleBlock(id,show){
    document.getElementById(id)
        .classList.toggle("hidden",!show);
}


/* =====================================================
   PASSENGER REGISTER
===================================================== */

function registerPassenger(){

    const first=document.getElementById("rgPFirst").value.trim();
    const last=document.getElementById("rgPLast").value.trim();
    const mobile=document.getElementById("rgPMobile").value.trim();
    const code=document.getElementById("rgAgencyCode").value.trim();
    const p1=document.getElementById("rgPPassword").value;
    const p2=document.getElementById("rgPPassword2").value;

    if(!first||!last||!mobile||!code||!p1){

        alert("اطلاعات الزامی را تکمیل کنید.");
        return;

    }

    if(!/^\d{5}$/.test(code)){

        alert("کد شناسه آژانس باید دقیقاً ۵ رقم باشد.");
        return;

    }

    if(!db.agencies.some(a=>a.code===code)){

        alert("کد شناسه آژانس معتبر نیست.");
        return;

    }

    if(p1!==p2){

        alert("تکرار رمز صحیح نیست.");
        return;

    }

    if(db.passengers.some(p=>p.mobile===mobile)){

        alert("این شماره موبایل قبلاً ثبت شده است.");
        return;

    }

    db.passengers.push({

        id:uid("PAX"),
        firstName:first,
        lastName:last,
        mobile,
        password:p1,
        agencyCode:code,
        createdAt:new Date().toISOString()

    });

    saveDB();

    alert("حساب مسافر با موفقیت ایجاد شد.");

    closeModal("registerModal");

}


/* =====================================================
   AGENCY REGISTER + SMS
===================================================== */

function registerAgency(){

    const name=document.getElementById("rgAName").value.trim();
    const manager=document.getElementById("rgAManager").value.trim();
    const mobile=document.getElementById("rgAMobile").value.trim();
    const email=document.getElementById("rgAEmail").value.trim();
    const pass=document.getElementById("rgAPassword").value;
    const address=document.getElementById("rgAAddress").value.trim();

    if(!name||!mobile||!pass){

        alert("نام آژانس، موبایل و رمز عبور الزامی است.");
        return;

    }

    if(db.agencies.some(a=>a.mobile===mobile)){

        alert("این شماره موبایل قبلاً ثبت شده است.");
        return;

    }

    const code=agencyCode();

    const agency={

        id:uid("AG"),
        code,
        name,
        manager,
        mobile,
        email,
        password:pass,
        address,
        status:"فعال",
        createdAt:new Date().toISOString()

    };

    db.agencies.push(agency);

    saveDB();

    /*
       در نسخه HTML دمو، API واقعی قابل فراخوانی مستقیم نیست.
       اطلاعات برای ارسال SMS آماده می‌شود.
       در نسخه PHP فقط sendAgencySMS() به API واقعی متصل می‌شود.
    */

    sendAgencySMS(agency);

    alert(
        "ثبت نام با موفقیت انجام شد.\n\n"+
        "کد شناسه طرف تجاری شما:\n\n"+
        code+
        "\n\n"+
        "در صورت فعال بودن سرویس پیامک، این کد برای شماره ثبت شده ارسال می‌شود."
    );

    closeModal("registerModal");

}


/* =====================================================
   LOGIN
===================================================== */

function passengerLogin(){

    const mobile=document.getElementById("plMobile").value.trim();
    const pass=document.getElementById("plPassword").value;

    const p=db.passengers.find(
        x=>x.mobile===mobile&&x.password===pass
    );

    if(!p){

        showMessage("اطلاعات ورود صحیح نیست.","danger");
        return;

    }

    currentUser={role:"passenger",id:p.id};

    openApp();

}

function agencyLogin(){

    const code=document.getElementById("alCode").value.trim();
    const mobile=document.getElementById("alMobile").value.trim();
    const pass=document.getElementById("alPassword").value;

    const a=db.agencies.find(
        x=>x.code===code&&
           x.mobile===mobile&&
           x.password===pass
    );

    if(!a){

        showMessage("اطلاعات طرف تجاری صحیح نیست.","danger");
        return;

    }

    currentUser={role:"agency",id:a.id};

    openApp();

}

function adminLogin(){

    const u=document.getElementById("adminUser").value;
    const p=document.getElementById("adminPass").value;

    if(u!==ADMIN_USER||p!==ADMIN_PASS){

        showMessage("اطلاعات مدیریت صحیح نیست.","danger");
        return;

    }

    currentUser={role:"admin",id:"SUPER-ADMIN"};

    openApp();

}

function logout(){

    currentUser=null;

    document.getElementById("appPage").classList.add("hidden");
    document.getElementById("loginPage").classList.remove("hidden");

    showLogin("passenger");

}


/* =====================================================
   CURRENT USER
===================================================== */

function getCurrentPassenger(){

    if(currentUser?.role!=="passenger")return null;

    return db.passengers.find(
        p=>p.id===currentUser.id
    );

}

function getCurrentAgency(){

    if(currentUser?.role!=="agency")return null;

    return db.agencies.find(
        a=>a.id===currentUser.id
    );

}


/* =====================================================
   OPEN APP
===================================================== */

function openApp(){

    document.getElementById("loginPage").classList.add("hidden");
    document.getElementById("appPage").classList.remove("hidden");

    document.getElementById("passengerDashboard").classList.add("hidden");
    document.getElementById("agencyDashboard").classList.add("hidden");
    document.getElementById("adminDashboard").classList.add("hidden");

    if(currentUser.role==="passenger")
        renderPassengerDashboard();

    if(currentUser.role==="agency")
        renderAgencyDashboard();

    if(currentUser.role==="admin")
        renderAdminDashboard();

}


/* =====================================================
   FORM LANGUAGE
===================================================== */

function setFormLanguage(lang){

    if(lang==="fa"){

        document.getElementById("langFA").classList.add("active");
        document.getElementById("langEN").classList.remove("active");

    }else{

        document.getElementById("langEN").classList.add("active");
        document.getElementById("langFA").classList.remove("active");

    }

}


/* =====================================================
   OPEN NEW APPLICATION
===================================================== */

function openNewApplication(){

    if(!currentUser)return;

    document.getElementById("applicationForm")?.reset?.();

    FORM_FIELDS.forEach(id=>{

        const el=document.getElementById(id);

        if(el)el.value="";

    });

    document.getElementById("editCaseId").value="";

    let code="";

    if(currentUser.role==="passenger"){

        const p=getCurrentPassenger();

        if(!p)return;

        code=p.agencyCode;

    }

    if(currentUser.role==="agency"){

        const a=getCurrentAgency();

        if(!a)return;

        code=a.code;

    }

    document.getElementById("applicationAgencyCode").value=code;

    document.getElementById("applicationNo").value=
        generateApplicationNumber();

    document.getElementById("applicationModal")
        .classList.remove("hidden");

}


/* =====================================================
   READ FORM
===================================================== */

function readForm(){

    const data={};

    FORM_FIELDS.forEach(id=>{

        const el=document.getElementById(id);

        if(el)data[id]=el.value;

    });

    return data;

}


/* =====================================================
   INDEXED DB
===================================================== */

const FILE_DB="EVISA_RU_FILES_V3";

function openFileDB(){

    return new Promise((resolve,reject)=>{

        const r=indexedDB.open(FILE_DB,1);

        r.onupgradeneeded=()=>{

            const d=r.result;

            if(!d.objectStoreNames.contains("files"))
                d.createObjectStore("files",{keyPath:"id"});

        };

        r.onsuccess=()=>resolve(r.result);
        r.onerror=()=>reject(r.error);

    });

}

async function saveFile(caseId,type,file){

    if(!file)return null;

    const d=await openFileDB();

    const id=caseId+"_"+type;

    const buffer=await file.arrayBuffer();

    return new Promise((resolve,reject)=>{

        const tx=d.transaction("files","readwrite");

        tx.objectStore("files").put({

            id,
            caseId,
            type,
            name:file.name,
            mime:file.type,
            size:file.size,
            data:buffer

        });

        tx.oncomplete=()=>resolve(id);
        tx.onerror=()=>reject(tx.error);

    });

}

async function getFile(id){

    if(!id)return null;

    const d=await openFileDB();

    return new Promise((resolve,reject)=>{

        const tx=d.transaction("files","readonly");

        const r=tx.objectStore("files").get(id);

        r.onsuccess=()=>resolve(r.result||null);
        r.onerror=()=>reject(r.error);

    });

}


/* =====================================================
   SAVE APPLICATION
===================================================== */

async function saveApplication(){

    const form=readForm();

    if(!form.passportNo||!form.surname||!form.givenName){

        alert(
            "نام، نام خانوادگی و شماره پاسپورت الزامی است."
        );

        return;

    }

    let passenger=getCurrentPassenger();
    let agency=getCurrentAgency();

    if(currentUser.role==="passenger"){

        if(!passenger)return;

        agency=db.agencies.find(
            a=>a.code===passenger.agencyCode
        );

    }

    let existingId=document.getElementById("editCaseId").value;

    let oldCase=db.cases.find(
        c=>c.id===existingId
    );

    let id=existingId||uid("CASE");

    let appNo=oldCase
        ?oldCase.applicationNo
        :document.getElementById("applicationNo").value;

    let tracking=oldCase
        ?oldCase.tracking
        :trackingNumber();

    const ownerName=passenger
        ?passenger.firstName+" "+passenger.lastName
        :form.givenName+" "+form.surname;

    const ownerMobile=passenger
        ?passenger.mobile
        :form.residencePhone;

    const caseData={

        id,

        applicationNo:appNo,

        tracking,

        passengerId:
            passenger
            ?passenger.id
            :(oldCase?.passengerId||null),

        ownerName,

        ownerMobile,

        agencyId:
            agency
            ?agency.id
            :(oldCase?.agencyId||null),

        agencyCode:
            agency
            ?agency.code
            :(oldCase?.agencyCode||""),

        agencyName:
            agency
            ?agency.name
            :(oldCase?.agencyName||""),

        status:
            oldCase
            ?oldCase.status
            :"ثبت اولیه / Initial",

        createdAt:
            oldCase
            ?oldCase.createdAt
            :new Date().toISOString(),

        updatedAt:new Date().toISOString(),

        form,

        history:
            oldCase
            ?oldCase.history
            :[{
                status:"ثبت اولیه / Initial",
                date:new Date().toISOString(),
                note:"پرونده ثبت شد."
            }],

        photoFile:oldCase?.photoFile||null,
        passportFile:oldCase?.passportFile||null,
        visaFile:oldCase?.visaFile||null

    };


    try{

        const photo=document.getElementById("photoFile")
            .files[0];

        const passport=document.getElementById("passportFile")
            .files[0];

        if(photo)
            caseData.photoFile=
                await saveFile(id,"photo",photo);

        if(passport)
            caseData.passportFile=
                await saveFile(id,"passport",passport);

    }catch(e){

        alert("خطا در ذخیره فایل.");
        return;

    }


    const index=db.cases.findIndex(c=>c.id===id);

    if(index>=0)
        db.cases[index]=caseData;
    else
        db.cases.push(caseData);

    saveDB();

    logActivity(
        oldCase
        ?"ویرایش پرونده توسط "+currentUser.role
        :"ایجاد پرونده جدید",
        caseData,
        currentUser.role
    );

    closeModal("applicationModal");

    alert(
        "پرونده با موفقیت ثبت شد.\n\n"+
        "شماره اپلیکیشن:\n"+
        appNo+
        "\n\n"+
        "کد رهگیری:\n"+
        tracking+
        "\n\n"+
        "برای پیگیری بدون ورود، هر دو شماره لازم است."
    );

    renderCurrentDashboard();

}


/* =====================================================
   STATUS
===================================================== */

function statusBadge(status){

    let cls="badge-gray";

    if(status.includes("ویزا صادر"))
        cls="badge-green";

    else if(status.includes("رد شد"))
        cls="badge-red";

    else if(status.includes("نقص"))
        cls="badge-orange";

    else if(
        status.includes("بررسی")||
        status.includes("ارسال")
    )
        cls="badge-blue";

    return `<span class="badge ${cls}">${esc(status)}</span>`;

}


/* =====================================================
   PASSENGER DASHBOARD
===================================================== */

function renderPassengerDashboard(){

    const p=getCurrentPassenger();

    if(!p)return;

    const cases=db.cases
        .filter(c=>c.passengerId===p.id)
        .sort((a,b)=>new Date(b.updatedAt)-new Date(a.updatedAt));

    document.getElementById("passengerDashboard")
        .classList.remove("hidden");

    document.getElementById("passengerName").textContent=
        p.firstName+" "+p.lastName;

    document.getElementById("passengerAgency").textContent=
        p.agencyCode;

    document.getElementById("passengerAgencyCodeView").value=
        p.agencyCode;

    document.getElementById("passengerMobileView").value=
        p.mobile;

    document.getElementById("passengerAvatar").textContent=
        p.firstName.substring(0,1);

    document.getElementById("topUser").textContent=p.mobile;

    document.getElementById("pStatTotal").textContent=cases.length;

    document.getElementById("pStatPending").textContent=
        cases.filter(c=>
            c.status.includes("بررسی")||
            c.status.includes("ارسال")||
            c.status.includes("تکمیل")
        ).length;

    document.getElementById("pStatIssued").textContent=
        cases.filter(c=>c.status.includes("ویزا صادر")).length;

    document.getElementById("pStatIncomplete").textContent=
        cases.filter(c=>c.status.includes("نقص")).length;

    if(!cases.length){

        document.getElementById("passengerCases").innerHTML=
            `<div class="empty">هنوز پرونده‌ای ندارید.</div>`;

        return;

    }

    document.getElementById("passengerCases").innerHTML=`

    <div class="table-wrap">

    <table>

    <thead>
    <tr>
    <th>شماره اپلیکیشن</th>
    <th>کد رهگیری</th>
    <th>موبایل</th>
    <th>پاسپورت</th>
    <th>آژانس</th>
    <th>وضعیت</th>
    <th>عملیات</th>
    </tr>
    </thead>

    <tbody>

    ${cases.map(c=>`

    <tr>

    <td><b>${esc(c.applicationNo)}</b></td>

    <td><b>${esc(c.tracking)}</b></td>

    <td>${esc(c.ownerMobile)}</td>

    <td>${esc(c.form.passportNo)}</td>

    <td>${esc(c.agencyCode)}</td>

    <td>${statusBadge(c.status)}</td>

    <td>

    <button class="btn btn-secondary btn-sm"
    onclick="viewCase('${c.id}')">
    مشاهده
    </button>

    ${
        c.visaFile
        ?
        `<button class="btn btn-success btn-sm"
        onclick="downloadStoredFile('${c.visaFile}')">
        دریافت ویزا
        </button>`
        :""
    }

    <button class="btn btn-primary btn-sm"
    onclick="printTracking('${c.id}')">
    چاپ
    </button>

    </td>

    </tr>

    `).join("")}

    </tbody>

    </table>

    </div>

    `;

}


/* =====================================================
   AGENCY
===================================================== */

function renderAgencyDashboard(){

    const a=getCurrentAgency();

    if(!a)return;

    document.getElementById("agencyDashboard")
        .classList.remove("hidden");

    document.getElementById("agencyNameTitle").textContent=a.name;
    document.getElementById("agencyCodeTitle").textContent=a.code;
    document.getElementById("topUser").textContent=a.mobile;

    renderAgencyCases();

}

function renderAgencyCases(){

    const a=getCurrentAgency();

    if(!a)return;

    let cases=db.cases.filter(
        c=>c.agencyCode===a.code
    );

    const search=(document.getElementById("agencySearch")?.value||"")
        .toLowerCase().trim();

    if(search){

        cases=cases.filter(c=>

            String(c.tracking).toLowerCase().includes(search)||
            String(c.applicationNo).toLowerCase().includes(search)||
            String(c.ownerName).toLowerCase().includes(search)||
            String(c.ownerMobile).toLowerCase().includes(search)||
            String(c.form.passportNo).toLowerCase().includes(search)

        );

    }

    const all=db.cases.filter(c=>c.agencyCode===a.code);

    document.getElementById("aTotal").textContent=all.length;

    document.getElementById("aPending").textContent=
        all.filter(c=>c.status.includes("بررسی")||
        c.status.includes("ارسال")||
        c.status.includes("تکمیل")).length;

    document.getElementById("aIssued").textContent=
        all.filter(c=>c.status.includes("ویزا صادر")).length;

    document.getElementById("aIncomplete").textContent=
        all.filter(c=>c.status.includes("نقص")).length;

    cases.sort(
        (x,y)=>new Date(y.updatedAt)-new Date(x.updatedAt)
    );

    if(!cases.length){

        document.getElementById("agencyCases").innerHTML=
            `<div class="empty">پرونده‌ای پیدا نشد.</div>`;

        return;

    }

    document.getElementById("agencyCases").innerHTML=`

    <div class="table-wrap">

    <table>

    <thead>
    <tr>
    <th>اپلیکیشن</th>
    <th>کد رهگیری</th>
    <th>مالک فرم</th>
    <th>موبایل</th>
    <th>پاسپورت</th>
    <th>وضعیت</th>
    <th>عملیات</th>
    </tr>
    </thead>

    <tbody>

    ${cases.map(c=>`

    <tr>

    <td>${esc(c.applicationNo)}</td>

    <td><b>${esc(c.tracking)}</b></td>

    <td>${esc(c.ownerName)}</td>

    <td>${esc(c.ownerMobile)}</td>

    <td>${esc(c.form.passportNo)}</td>

    <td>${statusBadge(c.status)}</td>

    <td>

    <button class="btn btn-secondary btn-sm"
    onclick="viewCase('${c.id}')">
    مشاهده
    </button>

    <button class="btn btn-warning btn-sm"
    onclick="agencyChangeStatus('${c.id}')">
    تغییر وضعیت
    </button>

    <button class="btn btn-primary btn-sm"
    onclick="printTracking('${c.id}')">
    چاپ
    </button>

    </td>

    </tr>

    `).join("")}

    </tbody>

    </table>

    </div>

    `;

}


/* =====================================================
   AGENCY STATUS ACTION
===================================================== */

function agencyChangeStatus(id){

    if(currentUser?.role!=="agency")return;

    const a=getCurrentAgency();

    const c=db.cases.find(
        x=>x.id===id&&x.agencyCode===a.code
    );

    if(!c)return;

    showStatusModal(c);

}


/* =====================================================
   ADMIN
===================================================== */

function renderAdminDashboard(){

    document.getElementById("adminDashboard")
        .classList.remove("hidden");

    document.getElementById("topUser").textContent="SUPER ADMIN";

    document.getElementById("adminTotal").textContent=db.cases.length;
    document.getElementById("adminAgencies").textContent=db.agencies.length;
    document.getElementById("adminPassengers").textContent=db.passengers.length;

    document.getElementById("adminIssued").textContent=
        db.cases.filter(c=>c.status.includes("ویزا صادر")).length;

    renderAdminCases();
    renderAgencyList();
    renderActivityLog();

}

function renderAdminCases(){

    let cases=[...db.cases];

    const search=(document.getElementById("adminSearch")?.value||"")
        .toLowerCase().trim();

    const filter=document.getElementById("adminStatusFilter")?.value||"";

    if(search){

        cases=cases.filter(c=>

            String(c.tracking).toLowerCase().includes(search)||
            String(c.applicationNo).toLowerCase().includes(search)||
            String(c.ownerName).toLowerCase().includes(search)||
            String(c.ownerMobile).toLowerCase().includes(search)||
            String(c.form.passportNo).toLowerCase().includes(search)

        );

    }

    if(filter)
        cases=cases.filter(c=>c.status===filter);

    cases.sort(
        (x,y)=>new Date(y.updatedAt)-new Date(x.updatedAt)
    );

    if(!cases.length){

        document.getElementById("adminCases").innerHTML=
            `<div class="empty">پرونده‌ای پیدا نشد.</div>`;

        return;

    }

    document.getElementById("adminCases").innerHTML=`

    <div class="table-wrap">

    <table>

    <thead>

    <tr>

    <th>اپلیکیشن</th>
    <th>کد رهگیری</th>
    <th>مالک فرم</th>
    <th>موبایل</th>
    <th>کد آژانس</th>
    <th>آژانس</th>
    <th>پاسپورت</th>
    <th>وضعیت</th>
    <th>ویزا</th>
    <th>عملیات</th>

    </tr>

    </thead>

    <tbody>

    ${cases.map(c=>`

    <tr>

    <td><b>${esc(c.applicationNo)}</b></td>

    <td><b>${esc(c.tracking)}</b></td>

    <td>${esc(c.ownerName)}</td>

    <td>${esc(c.ownerMobile)}</td>

    <td>${esc(c.agencyCode)}</td>

    <td>${esc(c.agencyName)}</td>

    <td>${esc(c.form.passportNo)}</td>

    <td>${statusBadge(c.status)}</td>

    <td>
    ${
        c.visaFile
        ?'<span class="badge badge-green">آپلود شده</span>'
        :'<span class="badge badge-gray">ندارد</span>'
    }
    </td>

    <td>

    <div class="actions">

    <button class="btn btn-secondary btn-sm"
    onclick="viewCase('${c.id}')">
    مشاهده
    </button>

    <button class="btn btn-warning btn-sm"
    onclick="showStatusModalById('${c.id}')">
    وضعیت
    </button>

    <button class="btn btn-primary btn-sm"
    onclick="editCase('${c.id}')">
    ویرایش
    </button>

    <button class="btn btn-success btn-sm"
    onclick="uploadVisa('${c.id}')">
    آپلود ویزا
    </button>

    <button class="btn btn-secondary btn-sm"
    onclick="printTracking('${c.id}')">
    چاپ
    </button>

    </div>

    </td>

    </tr>

    `).join("")}

    </tbody>

    </table>

    </div>

    `;

}


/* =====================================================
   STATUS DROPDOWN MODAL
===================================================== */

function showStatusModalById(id){

    const c=db.cases.find(x=>x.id===id);

    if(c)showStatusModal(c);

}

function showStatusModal(c){

    const value=prompt(
        "وضعیت جدید را از بین گزینه‌های زیر انتخاب کنید:\n\n"+
        STATUS_LIST.map((x,i)=>(i+1)+" - "+x).join("\n")+
        "\n\nشماره گزینه را وارد کنید:",
        String(STATUS_LIST.indexOf(c.status)+1)
    );

    if(value===null)return;

    const n=parseInt(value);

    if(!n||n<1||n>STATUS_LIST.length){

        alert("گزینه معتبر نیست.");
        return;

    }

    const newStatus=STATUS_LIST[n-1];

    const note=prompt(
        "توضیح این تغییر:",
        ""
    )||"";

    const oldStatus=c.status;

    c.status=newStatus;
    c.updatedAt=new Date().toISOString();

    if(!c.history)c.history=[];

    c.history.push({

        status:newStatus,
        date:new Date().toISOString(),
        note

    });

    saveDB();

    logActivity(
        "تغییر وضعیت از «"+oldStatus+"» به «"+newStatus+"»",
        c,
        currentUser.role
    );

    renderCurrentDashboard();

}


/* =====================================================
   VIEW CASE
===================================================== */

function viewCase(id){

    const c=db.cases.find(x=>x.id===id);

    if(!c)return;

    document.getElementById("caseModal")
        .classList.remove("hidden");

    document.getElementById("caseDetails").innerHTML=`

    <div class="app-code-box">

    <div class="grid">

    <div class="col-6">

    <label>شماره اپلیکیشن / Application Number</label>

    <div class="app-code">
    ${esc(c.applicationNo)}
    </div>

    </div>

    <div class="col-6">

    <label>کد رهگیری / Tracking Number</label>

    <div class="app-code">
    ${esc(c.tracking)}
    </div>

    </div>

    </div>

    <div class="actions" style="margin-top:10px">

    <button class="btn btn-primary btn-sm"
    onclick="printTracking('${c.id}')">
    چاپ کدها / Print
    </button>

    </div>

    </div>


    <div class="grid" style="margin-top:12px">

    <div class="col-3">
    <label>مالک فرم</label>
    <div>${esc(c.ownerName)}</div>
    </div>

    <div class="col-3">
    <label>موبایل</label>
    <div><b>${esc(c.ownerMobile)}</b></div>
    </div>

    <div class="col-3">
    <label>کد طرف تجاری</label>
    <div>${esc(c.agencyCode)}</div>
    </div>

    <div class="col-3">
    <label>وضعیت</label>
    <div>${statusBadge(c.status)}</div>
    </div>

    </div>

    ${progressHTML(c.status)}


    <div class="card" style="box-shadow:none;margin-top:15px">

    <div class="card-header">
    <h3>اطلاعات پاسپورت</h3>
    </div>

    <div class="card-body">

    <div class="grid">

    <div class="col-3">
    <label>نام</label>
    <div>${esc(c.form.givenName)}</div>
    </div>

    <div class="col-3">
    <label>نام خانوادگی</label>
    <div>${esc(c.form.surname)}</div>
    </div>

    <div class="col-3">
    <label>پاسپورت</label>
    <div>${esc(c.form.passportNo)}</div>
    </div>

    <div class="col-3">
    <label>تاریخ ورود</label>
    <div>${esc(c.form.russiaEntryDate)}</div>
    </div>

    </div>

    </div>
    </div>


    <div class="card" style="box-shadow:none">

    <div class="card-header">
    <h3>تاریخچه اقدامات / Activity History</h3>
    </div>

    <div class="card-body">

    <div class="timeline">

    ${(c.history||[]).map(h=>`

    <div class="timeline-item active">

    <strong>${esc(h.status)}</strong>

    <small>
    ${formatDate(h.date)}
    ${h.note?" — "+esc(h.note):""}
    </small>

    </div>

    `).join("")}

    </div>

    </div>

    </div>


    <div class="card" style="box-shadow:none">

    <div class="card-header">
    <h3>مدارک / Documents</h3>
    </div>

    <div class="card-body">

    <div class="actions">

    ${
        c.photoFile
        ?`<button class="btn btn-secondary btn-sm"
        onclick="downloadStoredFile('${c.photoFile}')">
        دریافت عکس
        </button>`:""
    }

    ${
        c.passportFile
        ?`<button class="btn btn-secondary btn-sm"
        onclick="downloadStoredFile('${c.passportFile}')">
        دریافت پاسپورت
        </button>`:""
    }

    ${
        c.visaFile
        ?`<button class="btn btn-success btn-sm"
        onclick="downloadStoredFile('${c.visaFile}')">
        دریافت ویزا
        </button>`:""
    }

    </div>

    </div>

    </div>

    `;

}


/* =====================================================
   EDIT
===================================================== */

function editCase(id){

    const c=db.cases.find(x=>x.id===id);

    if(!c)return;

    closeModal("caseModal");

    FORM_FIELDS.forEach(id=>{

        const el=document.getElementById(id);

        if(el)
            el.value=c.form[id]||"";

    });

    document.getElementById("editCaseId").value=c.id;
    document.getElementById("applicationNo").value=c.applicationNo;
    document.getElementById("applicationAgencyCode").value=c.agencyCode;

    document.getElementById("applicationModal")
        .classList.remove("hidden");

}


/* =====================================================
   FILES
===================================================== */

async function uploadVisa(id){

    if(currentUser?.role!=="admin"){

        alert("فقط مدیریت کل می‌تواند ویزای صادر شده را آپلود کند.");
        return;

    }

    const c=db.cases.find(x=>x.id===id);

    if(!c)return;

    const input=document.createElement("input");

    input.type="file";
    input.accept="image/*,.pdf";

    input.onchange=async()=>{

        const file=input.files[0];

        if(!file)return;

        try{

            c.visaFile=await saveFile(
                c.id,
                "visa",
                file
            );

            const oldStatus=c.status;

            c.status="ویزا صادر شد / Visa Issued";

            c.updatedAt=new Date().toISOString();

            if(!c.history)c.history=[];

            c.history.push({

                status:c.status,
                date:new Date().toISOString(),
                note:"ویزای صادر شده توسط مدیریت کل آپلود شد."

            });

            saveDB();

            logActivity(
                "آپلود ویزای صادر شده و تغییر وضعیت از «"+
                oldStatus+"» به «"+
                c.status+"»",
                c,
                "SUPER ADMIN"
            );

            alert("ویزای صادر شده با موفقیت ثبت شد.");

            renderAdminDashboard();

        }catch(e){

            alert("خطا در آپلود فایل.");

        }

    };

    input.click();

}

async function downloadStoredFile(id){

    const file=await getFile(id);

    if(!file){

        alert("فایل پیدا نشد.");
        return;

    }

    const blob=new Blob(
        [file.data],
        {type:file.mime||"application/octet-stream"}
    );

    const url=URL.createObjectURL(blob);

    const a=document.createElement("a");

    a.href=url;
    a.download=file.name||"document";

    document.body.appendChild(a);
    a.click();
    a.remove();

    setTimeout(
        ()=>URL.revokeObjectURL(url),
        1000
    );

}


/* =====================================================
   PRINT TRACKING + APPLICATION
===================================================== */

function printTracking(id){

    const c=db.cases.find(x=>x.id===id);

    if(!c)return;

    const w=window.open("","_blank");

    w.document.write(`

    <!DOCTYPE html>

    <html lang="fa" dir="rtl">

    <head>

    <meta charset="UTF-8">

    <title>Tracking - ${esc(c.tracking)}</title>

    <style>

    body{
        font-family:Tahoma,Arial;
        padding:35px;
        color:#222;
        font-size:13px;
    }

    .box{
        border:2px solid #1261a0;
        border-radius:10px;
        padding:25px;
        max-width:750px;
        margin:auto;
    }

    h1{
        color:#1261a0;
        text-align:center;
    }

    .code{
        border:1px solid #ccc;
        padding:15px;
        margin:12px 0;
        text-align:center;
        direction:ltr;
        font-family:Consolas,monospace;
        font-size:21px;
        font-weight:bold;
        letter-spacing:2px;
    }

    table{
        width:100%;
        border-collapse:collapse;
        margin-top:20px;
    }

    td{
        border:1px solid #ccc;
        padding:9px;
    }

    .label{
        background:#f1f5f9;
        font-weight:bold;
    }

    </style>

    </head>

    <body>

    <div class="box">

    <h1>
    ویزای الکترونیکی روسیه
    <br>
    Russia E-Visa
    </h1>

    <p style="text-align:center">
    برگه پیگیری پرونده / Application Tracking
    </p>

    <div>
    شماره اپلیکیشن / Application Number
    </div>

    <div class="code">
    ${esc(c.applicationNo)}
    </div>

    <div>
    کد رهگیری / Tracking Number
    </div>

    <div class="code">
    ${esc(c.tracking)}
    </div>

    <table>

    <tr>
    <td class="label">نام مسافر / Passenger</td>
    <td>${esc(c.ownerName)}</td>
    </tr>

    <tr>
    <td class="label">موبایل / Mobile</td>
    <td>${esc(c.ownerMobile)}</td>
    </tr>

    <tr>
    <td class="label">پاسپورت / Passport</td>
    <td>${esc(c.form.passportNo)}</td>
    </tr>

    <tr>
    <td class="label">کد آژانس / Agency ID</td>
    <td>${esc(c.agencyCode)}</td>
    </tr>

    <tr>
    <td class="label">وضعیت / Status</td>
    <td>${esc(c.status)}</td>
    </tr>

    </table>

    <p style="margin-top:25px">

    برای پیگیری بدون ورود، «شماره اپلیکیشن» و «کد رهگیری» هر دو مورد نیاز است.

    <br>

    To track without login, both Application Number and Tracking Number are required.

    </p>

    </div>

    <script>
    window.onload=function(){
        window.print();
    }
    <\/script>

    </body>

    </html>

    `);

    w.document.close();

}


/* =====================================================
   GUEST TRACKING
===================================================== */

function trackGuest(){

    const app=prompt(
        "شماره اپلیکیشن / Application Number:"
    );

    if(!app)return;

    const tracking=prompt(
        "کد رهگیری / Tracking Number:"
    );

    if(!tracking)return;

    const c=db.cases.find(
        x=>
        x.applicationNo.toLowerCase()===app.trim().toLowerCase() &&
        x.tracking.toLowerCase()===tracking.trim().toLowerCase()
    );

    if(!c){

        alert(
            "اطلاعات وارد شده صحیح نیست.\n"+
            "Both Application Number and Tracking Number are required."
        );

        return;

    }

    document.getElementById("loginPage")
        .classList.add("hidden");

    document.getElementById("appPage")
        .classList.remove("hidden");

    document.getElementById("passengerDashboard")
        .classList.remove("hidden");

    document.getElementById("agencyDashboard")
        .classList.add("hidden");

    document.getElementById("adminDashboard")
        .classList.add("hidden");

    document.getElementById("topUser").textContent=
        "Guest Tracking";

    document.getElementById("passengerName").textContent=
        c.ownerName;

    document.getElementById("passengerAgency").textContent=
        c.agencyCode;

    document.getElementById("pStatTotal").textContent="1";

    document.getElementById("pStatPending").textContent=
        c.status.includes("بررسی")||
        c.status.includes("ارسال")
        ?"1":"0";

    document.getElementById("pStatIssued").textContent=
        c.status.includes("ویزا صادر")
        ?"1":"0";

    document.getElementById("pStatIncomplete").textContent=
        c.status.includes("نقص")
        ?"1":"0";

    document.getElementById("passengerCases").innerHTML=`

    <div class="app-code-box">

    <div class="grid">

    <div class="col-6">
    <label>شماره اپلیکیشن</label>
    <div class="app-code">${esc(c.applicationNo)}</div>
    </div>

    <div class="col-6">
    <label>کد رهگیری</label>
    <div class="app-code">${esc(c.tracking)}</div>
    </div>

    </div>

    </div>

    <div class="card" style="margin-top:12px">

    <div class="card-body">

    <div class="grid">

    <div class="col-4">
    <label>مسافر</label>
    <div>${esc(c.ownerName)}</div>
    </div>

    <div class="col-4">
    <label>موبایل</label>
    <div>${esc(c.ownerMobile)}</div>
    </div>

    <div class="col-4">
    <label>وضعیت</label>
    <div>${statusBadge(c.status)}</div>
    </div>

    </div>

    <div class="actions" style="margin-top:15px">

    <button class="btn btn-primary"
    onclick="viewCase('${c.id}')">
    مشاهده جزئیات
    </button>

    <button class="btn btn-secondary"
    onclick="printTracking('${c.id}')">
    چاپ کد رهگیری
    </button>

    ${
        c.visaFile
        ?
        `<button class="btn btn-success"
        onclick="downloadStoredFile('${c.visaFile}')">
        دریافت ویزا
        </button>`
        :""
    }

    </div>

    </div>

    </div>

    `;

}


/* =====================================================
   AGENCY LIST
===================================================== */

function renderAgencyList(){

    if(!db.agencies.length){

        document.getElementById("agencyList").innerHTML=
            `<div class="empty">همکاری ثبت نشده است.</div>`;

        return;

    }

    document.getElementById("agencyList").innerHTML=`

    <div class="table-wrap">

    <table>

    <thead>

    <tr>
    <th>نام طرف تجاری</th>
    <th>مدیر</th>
    <th>کد شناسه</th>
    <th>موبایل</th>
    <th>پرونده‌ها</th>
    <th>SMS</th>
    <th>وضعیت</th>
    </tr>

    </thead>

    <tbody>

    ${db.agencies.map(a=>`

    <tr>

    <td>${esc(a.name)}</td>

    <td>${esc(a.manager)}</td>

    <td><b>${esc(a.code)}</b></td>

    <td>${esc(a.mobile)}</td>

    <td>
    ${db.cases.filter(c=>c.agencyCode===a.code).length}
    </td>

    <td>
    ${
        getSMSSettings().enabled
        ?'<span class="badge badge-green">فعال</span>'
        :'<span class="badge badge-gray">غیرفعال</span>'
    }
    </td>

    <td>
    <span class="badge badge-green">${esc(a.status)}</span>
    </td>

    </tr>

    `).join("")}

    </tbody>

    </table>

    </div>

    `;

}


/* =====================================================
   ACTIVITY LOG
===================================================== */

function renderActivityLog(){

    const box=document.getElementById("activityLog");

    if(!db.activities.length){

        box.innerHTML=
            `<div class="empty">هنوز اکشنی ثبت نشده است.</div>`;

        return;

    }

    box.innerHTML=db.activities.slice(0,100).map(x=>`

    <div class="event-box">

    <b>${esc(x.action)}</b>

    <br>

    کد رهگیری:
    <strong>${esc(x.tracking)}</strong>

    |

    اپلیکیشن:
    <strong>${esc(x.applicationNo)}</strong>

    |

    طرف تجاری:
    <strong>${esc(x.agencyCode)}</strong>

    <br>

    مالک فرم:
    ${esc(x.owner)}

    |

    اجرا کننده:
    ${esc(x.actor)}

    |

    ${formatDate(x.date)}

    </div>

    `).join("");

}


/* =====================================================
   SMS SETTINGS
===================================================== */

function getSMSSettings(){

    try{

        const x=localStorage.getItem(SMS_KEY);

        if(x)
            return JSON.parse(x);

    }catch(e){}

    return {

        enabled:false,
        provider:"",
        username:"",
        password:"",
        apiKey:"",
        sender:"",
        support:"",
        endpoint:"",
        templateId:"",
        messageTemplate:"کد شناسه طرف تجاری شما: {AGENCY_CODE}"

    };

}

function openSMSSettings(){

    const s=getSMSSettings();

    document.getElementById("smsEnabled").checked=s.enabled;
    document.getElementById("smsProvider").value=s.provider||"other";
    document.getElementById("smsUsername").value=s.username||"";
    document.getElementById("smsPassword").value=s.password||"";
    document.getElementById("smsApiKey").value=s.apiKey||"";
    document.getElementById("smsSender").value=s.sender||"";
    document.getElementById("smsSupport").value=s.support||"";
    document.getElementById("smsEndpoint").value=s.endpoint||"";
    document.getElementById("smsTemplateId").value=s.templateId||"";
    document.getElementById("smsMessageTemplate").value=
        s.messageTemplate||
        "کد شناسه طرف تجاری شما: {AGENCY_CODE}";

    document.getElementById("smsModal")
        .classList.remove("hidden");

}

function saveSMSSettings(){

    const s={

        enabled:document.getElementById("smsEnabled").checked,

        provider:document.getElementById("smsProvider").value,

        username:document.getElementById("smsUsername").value,

        password:document.getElementById("smsPassword").value,

        apiKey:document.getElementById("smsApiKey").value,

        sender:document.getElementById("smsSender").value,

        support:document.getElementById("smsSupport").value,

        endpoint:document.getElementById("smsEndpoint").value,

        templateId:document.getElementById("smsTemplateId").value,

        messageTemplate:
            document.getElementById("smsMessageTemplate").value

    };

    localStorage.setItem(
        SMS_KEY,
        JSON.stringify(s)
    );

    alert(
        "تنظیمات SMS ذخیره شد.\n\n"+
        "در نسخه HTML این اطلاعات فقط برای دمو ذخیره می‌شوند. "+
        "برای ارسال واقعی باید API در PHP سمت سرور متصل شود."
    );

}


/* =====================================================
   SMS INFRASTRUCTURE
===================================================== */

function sendAgencySMS(agency){

    const s=getSMSSettings();

    if(!s.enabled){

        console.log(
            "SMS disabled. Agency code:",
            agency.code
        );

        return;

    }

    /*
       این تابع محل اتصال API واقعی پیامک است.

       در نسخه PHP:
       - API Key
       - Username
       - Password
       - Sender
       - Endpoint
       - Template ID
       باید از سمت سرور استفاده شوند.

       هرگز API Key واقعی را در JavaScript عمومی قرار ندهید.
    */

    const message=
        s.messageTemplate
        .replaceAll("{AGENCY_CODE}",agency.code)
        .replaceAll("{MOBILE}",agency.mobile)
        .replaceAll("{AGENCY_NAME}",agency.name);

    console.log("SMS READY:",{

        provider:s.provider,
        endpoint:s.endpoint,
        sender:s.sender,
        templateId:s.templateId,
        mobile:agency.mobile,
        message

    });

}


/* =====================================================
   SMS TEST
===================================================== */

function testSMS(){

    const s=getSMSSettings();

    if(!s.enabled){

        alert(
            "سیستم پیامک فعال نیست.\n"+
            "ابتدا گزینه فعال‌سازی را روشن و تنظیمات را ذخیره کنید."
        );

        return;

    }

    if(!s.endpoint && !s.apiKey){

        alert(
            "زیرساخت آماده است ولی API Endpoint یا API Key وارد نشده است."
        );

        return;

    }

    alert(
        "پارامترهای SMS دریافت شد.\n\n"+
        "برای ارسال واقعی باید API سرویس‌دهنده در نسخه PHP به این زیرساخت متصل شود."
    );

}


/* =====================================================
   FORMAT DATE
===================================================== */

function formatDate(v){

    if(!v)return "-";

    const d=new Date(v);

    if(isNaN(d.getTime()))return v;

    return d.toLocaleDateString("fa-IR")+
        " "+
        d.toLocaleTimeString("fa-IR",{
            hour:"2-digit",
            minute:"2-digit"
        });

}


/* =====================================================
   RENDER CURRENT
===================================================== */

function renderCurrentDashboard(){

    if(!currentUser)return;

    if(currentUser.role==="passenger")
        renderPassengerDashboard();

    if(currentUser.role==="agency")
        renderAgencyDashboard();

    if(currentUser.role==="admin")
        renderAdminDashboard();

}


/* =====================================================
   DEMO AGENCY
===================================================== */

(function(){

    if(!db.agencies.length){

        db.agencies.push({

            id:"AG-DEMO",

            code:"12345",

            name:"آژانس نمونه گردشگری",

            manager:"مدیر سیستم",

            mobile:"09120000000",

            email:"demo@example.com",

            password:"123456",

            address:"",

            status:"فعال",

            createdAt:new Date().toISOString()

        });

        saveDB();

    }

})();


/* =====================================================
   ESCAPE CLOSE
===================================================== */

document.addEventListener("keydown",e=>{

    if(e.key==="Escape"){

        document.querySelectorAll(".modal")
            .forEach(x=>x.classList.add("hidden"));

    }

});

</script>

</body>
</html>