<?php
declare(strict_types=1);

ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

require_once __DIR__ . '/../db.php';
require_once __DIR__ . '/../inc/auth.php';
require_once __DIR__ . '/../inc/layout.php';
require_once __DIR__ . '/../inc/activity_log.php';

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

if (empty($_SESSION['user_id'])) {
    header("Location: ../index.html");
    exit;
}

$pdo = db();

if (!$pdo instanceof PDO) {
    http_response_code(500);
    exit('DB not ready');
}

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

if (!function_exists('h')) {
    function h($v): string {
        return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8');
    }
}

if (!function_exists('table_columns')) {
    function table_columns(PDO $pdo, string $table): array {
        try {
            $st = $pdo->query("
                SELECT COLUMN_NAME
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_SCHEMA = DATABASE()
                  AND TABLE_NAME = " . $pdo->quote($table)
            );
            return $st->fetchAll(PDO::FETCH_COLUMN) ?: [];
        } catch (Throwable $e) {
            return [];
        }
    }
}

if (!function_exists('has_col')) {
    function has_col(array $cols, string $name): bool {
        return in_array($name, $cols, true);
    }
}

if (!function_exists('generate_unique_contract_value')) {
    function generate_unique_contract_value(PDO $pdo, string $column, string $prefix): string {
        for ($i = 0; $i < 25; $i++) {
            $value = $prefix . '-' . date('YmdHis') . '-' . random_int(100, 999);

            $st = $pdo->prepare("SELECT id FROM contracts WHERE `$column` = ? LIMIT 1");
            $st->execute([$value]);

            if (!$st->fetchColumn()) {
                return $value;
            }

            usleep(100000);
        }

        return $prefix . '-' . date('YmdHis') . '-' . random_int(1000, 9999);
    }
}

if (!function_exists('strip_html_to_text')) {
    function strip_html_to_text(string $html): string {
        $text = preg_replace('/<br\s*\/?>/i', "\n", $html);
        $text = preg_replace('/<\/p>/i', "\n\n", (string)$text);
        $text = preg_replace('/<\/div>/i', "\n", (string)$text);
        $text = strip_tags((string)$text);
        $text = html_entity_decode((string)$text, ENT_QUOTES, 'UTF-8');
        $text = preg_replace("/\n{3,}/", "\n\n", (string)$text);
        return trim((string)$text);
    }
}

$userId   = (int)($_SESSION['user_id'] ?? 0);
$branchId = (int)($_SESSION['branch_id'] ?? 0);

$title            = '';
$client_id        = '';
$lawyer_id        = '';
$contract_type_id = '';
$start_date       = '';
$end_date         = '';
$status           = 'مسودة';
$contract_html    = '';
$message          = '';
$messageType      = '';

$contractsCols     = table_columns($pdo, 'contracts');
$contractFilesCols = table_columns($pdo, 'contract_files');
$contractLogsCols  = table_columns($pdo, 'contract_logs');

$types = [];
try {
    $typeCols = table_columns($pdo, 'contract_types');
    $typeNameCol = in_array('contract_name', $typeCols, true) ? 'contract_name' : 'name';

    $types = $pdo->query("
        SELECT id, `$typeNameCol` AS type_name
        FROM contract_types
        ORDER BY `$typeNameCol` ASC
    ")->fetchAll();
} catch (Throwable $e) {
    $types = [];
}

$clients = [];
try {
    $clients = $pdo->query("
        SELECT id, name
        FROM clients
        WHERE name IS NOT NULL AND name <> ''
        ORDER BY name ASC
    ")->fetchAll();
} catch (Throwable $e) {
    $clients = [];
}

$lawyers = [];
try {
    $employeeCols = table_columns($pdo, 'employees');
    $employeeNameCol = in_array('full_name', $employeeCols, true) ? 'full_name' : 'name';

    $lawyers = $pdo->query("
        SELECT MIN(id) AS id, `$employeeNameCol` AS full_name
        FROM employees
        WHERE `$employeeNameCol` IS NOT NULL
          AND `$employeeNameCol` <> ''
        GROUP BY `$employeeNameCol`
        ORDER BY `$employeeNameCol` ASC
    ")->fetchAll();
} catch (Throwable $e) {
    $lawyers = [];
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $title            = trim((string)($_POST['title'] ?? ''));
    $client_id        = (string)(int)($_POST['client_id'] ?? 0);
    $lawyer_id        = (string)(int)($_POST['lawyer_id'] ?? 0);
    $contract_type_id = (string)(int)($_POST['contract_type_id'] ?? 0);
    $start_date       = trim((string)($_POST['start_date'] ?? ''));
    $end_date         = trim((string)($_POST['end_date'] ?? ''));
    $status           = trim((string)($_POST['status'] ?? 'مسودة'));
    $contract_html    = trim((string)($_POST['contract_html'] ?? ''));

    if ($title === '' || $client_id === '0' || $lawyer_id === '0') {
        $message = 'يرجى تعبئة جميع الحقول الأساسية.';
        $messageType = 'err';
    } elseif ($start_date !== '' && $end_date !== '' && $end_date < $start_date) {
        $message = 'تاريخ انتهاء السريان يجب أن يكون بعد أو مساويًا لتاريخ بدء السريان.';
        $messageType = 'err';
    } else {
        try {
            $pdo->beginTransaction();

            $transactionId = has_col($contractsCols, 'transaction_id')
                ? generate_unique_contract_value($pdo, 'transaction_id', 'TRX')
                : null;

            $contractNo = has_col($contractsCols, 'contract_no')
                ? generate_unique_contract_value($pdo, 'contract_no', 'CT')
                : null;

            $insertCols = [];
            $insertVals = [];
            $params = [];

            $map = [
                'client_id'        => (int)$client_id,
                'lawyer_id'        => (int)$lawyer_id,
                'contract_type_id' => $contract_type_id !== '0' ? (int)$contract_type_id : null,
                'transaction_id'   => $transactionId,
                'contract_no'      => $contractNo,
                'contract_name'    => $title,
                'title'            => $title,
                'status'           => $status,
                'start_date'       => $start_date !== '' ? $start_date : null,
                'end_date'         => $end_date !== '' ? $end_date : null,
                'contract_html'    => $contract_html !== '' ? $contract_html : null,
                'content_html'     => $contract_html !== '' ? $contract_html : null,
                'contract_content' => strip_html_to_text($contract_html),
                'content'          => strip_html_to_text($contract_html),
                'branch_id'        => $branchId > 0 ? $branchId : null,
                'created_by'       => $userId > 0 ? $userId : null,
            ];

            foreach ($map as $col => $value) {
                if (has_col($contractsCols, $col)) {
                    $insertCols[] = "`$col`";
                    $insertVals[] = '?';
                    $params[] = $value;
                }
            }

            if (has_col($contractsCols, 'created_at')) {
                $insertCols[] = '`created_at`';
                $insertVals[] = 'NOW()';
            }

            if (has_col($contractsCols, 'updated_at')) {
                $insertCols[] = '`updated_at`';
                $insertVals[] = 'NOW()';
            }

            if (!$insertCols) {
                throw new RuntimeException('تعذر تحديد أعمدة الحفظ في جدول العقود.');
            }

            $sql = "INSERT INTO contracts (" . implode(', ', $insertCols) . ")
                    VALUES (" . implode(', ', $insertVals) . ")";

            $stmt = $pdo->prepare($sql);
            $stmt->execute($params);

            $contractId = (int)$pdo->lastInsertId();

            if ($contractId <= 0) {
                throw new RuntimeException('لم يتم إنشاء رقم العقد.');
            }

            if (
                has_col($contractLogsCols, 'contract_id') &&
                has_col($contractLogsCols, 'action')
            ) {
                $logCols = ['contract_id', 'action'];
                $logVals = ['?', '?'];
                $logParams = [$contractId, 'created_manual'];

                if (has_col($contractLogsCols, 'notes')) {
                    $logCols[] = 'notes';
                    $logVals[] = '?';
                    $logParams[] = 'تم إنشاء العقد يدويًا من صفحة add_contract.php';
                }

                if (has_col($contractLogsCols, 'action_by')) {
                    $logCols[] = 'action_by';
                    $logVals[] = '?';
                    $logParams[] = $userId > 0 ? $userId : null;
                }

                if (has_col($contractLogsCols, 'created_at')) {
                    $logCols[] = 'created_at';
                    $logVals[] = 'NOW()';
                }

                $logStmt = $pdo->prepare("
                    INSERT INTO contract_logs (" . implode(', ', $logCols) . ")
                    VALUES (" . implode(', ', $logVals) . ")
                ");
                $logStmt->execute($logParams);
            }

            $pdo->commit();

            activity_log(
                $pdo,
                'create_contract',
                'contracts',
                'contract',
                $contractId,
                'تم إضافة عقد جديد: ' . $title . ($contractNo !== null ? ' | رقم العقد: ' . $contractNo : ''),
                'إضافة عقد',
                '📄',
                '#8b5cf6'
            );

            header("Location: view_contract.php?id=" . $contractId . "&created=1");
            exit;

        } catch (Throwable $e) {
            if ($pdo->inTransaction()) {
                $pdo->rollBack();
            }

            $message = 'خطأ أثناء حفظ العقد: ' . $e->getMessage();
            $messageType = 'err';
        }
    }
}

render_layout_start('إضافة عقد');
?>
<style>
:root{
  --hlg-dark:#0b3440;
  --hlg-teal:#0a6474;
  --hlg-teal-2:#0d7d92;
  --hlg-line:#dce7eb;
  --hlg-text:#17343b;
  --hlg-muted:#8a9aa3;
  --hlg-soft:#f7fbfc;
  --hlg-shadow:0 18px 44px rgba(0,66,79,.10);
}

.contract-page{
  max-width:1400px;
  margin:auto;
  padding:30px 30px 40px;
  direction:rtl;
  font-family:'Tajawal',sans-serif;
}

.contract-head{
  display:flex;
  justify-content:space-between;
  align-items:flex-start;
  gap:20px;
  flex-wrap:wrap;
  margin-bottom:30px;
}

.contract-title h2{
  margin:0;
  font-size:28px;
  color:var(--hlg-dark);
  font-weight:800;
}

.contract-title .muted{
  font-size:13px;
  color:var(--hlg-muted);
  margin-top:6px;
  line-height:1.8;
}

.contract-grid{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:26px;
  margin-top:10px;
}

.contract-full{
  grid-column:1 / -1;
}

.contract-grid label{
  display:block;
  font-size:14px;
  margin-bottom:6px;
  color:var(--hlg-dark);
  font-weight:800;
}

.field-help,
.hint{
  font-size:12px;
  color:#9aa7ad;
  margin-bottom:8px;
  line-height:1.7;
}

.contract-grid input,
.contract-grid select,
.contract-grid textarea{
  width:100%;
  padding:12px 16px;
  border-radius:14px;
  border:1px solid rgba(255,255,255,.10);
}

.contract-grid input,
.contract-grid select{
  height:52px;
}

.contract-grid textarea{
  min-height:360px;
  resize:vertical;
  line-height:2;
}

.contract-actions{
  margin-top:28px;
  display:flex;
  gap:12px;
  justify-content:flex-start;
  align-items:center;
  flex-wrap:wrap;
}

.contract-alert{
  margin-bottom:18px;
}

.contract-select,
select.input,
input.input,
textarea.input{
  background:#071a23 !important;
  color:#ffffff !important;
  border:1px solid rgba(255,255,255,.12) !important;
}

.contract-select option,
select.input option{
  background:#0b2230;
  color:#ffffff;
}

.contract-select:focus,
select.input:focus,
.input:focus{
  outline:none;
  border-color:#0ea5b7 !important;
  box-shadow:0 0 0 3px rgba(14,165,183,.18);
}

.ts-wrapper{width:100%}
.ts-wrapper .ts-control{
  min-height:52px !important;
  border-radius:14px !important;
  background:rgba(3,18,28,.92) !important;
  border:1px solid rgba(255,255,255,.10) !important;
  box-shadow:none !important;
  padding:10px 14px !important;
}
.ts-wrapper.single .ts-control .item,
.ts-wrapper.single .ts-control input{
  color:#fff !important;
}
.ts-wrapper.focus .ts-control{
  border-color:rgba(0,170,210,.55) !important;
  box-shadow:0 0 0 3px rgba(0,170,210,.10) !important;
}
.ts-dropdown{
  background:#071c29 !important;
  border:1px solid rgba(255,255,255,.10) !important;
  border-radius:14px !important;
  overflow:hidden;
  margin-top:6px;
}
.ts-dropdown .option,
.ts-dropdown .create{
  color:#fff !important;
  padding:12px 14px !important;
  background:transparent !important;
}
.ts-dropdown .active{
  background:rgba(0,140,170,.22) !important;
}
.ts-dropdown .selected{
  background:rgba(0,140,170,.28) !important;
}
.ts-control,
.ts-control input::placeholder{
  color:rgba(255,255,255,.72) !important;
}
.no-results{
  padding:12px 14px;
  color:rgba(255,255,255,.65);
}

.editor-note{
  margin-top:8px;
  font-size:12px;
  color:#95a8af;
  line-height:1.8;
}

@media (max-width:900px){
  .contract-grid{
    grid-template-columns:1fr;
  }

  .contract-page{
    padding:18px 16px 30px;
  }
}
</style>

<div class="card contract-page">
  <form method="post" action="" enctype="multipart/form-data">
    <div class="cardHead contract-head">
      <div class="contract-title">
        <h2>إضافة عقد قانوني جديد</h2>
        <div class="muted">يرجى تعبئة البيانات التعاقدية وربط العقد بالعميل والمحامي المسؤول قبل الحفظ.</div>
      </div>
      <a href="index.php" class="btn ghost">العودة إلى قائمة العقود</a>
    </div>

    <?php if ($message !== ''): ?>
      <div class="msg <?= $messageType === 'err' ? 'err' : 'ok' ?> contract-alert"><?= h($message) ?></div>
    <?php endif; ?>

    <div class="contract-grid">
      <div class="contract-full">
        <label for="title">المسمى التعاقدي</label>
        <div class="field-help">أدخل الاسم الرسمي الذي سيظهر في سجلات العقود داخل النظام.</div>
        <input
          class="input"
          id="title"
          type="text"
          name="title"
          value="<?= h($title) ?>"
          placeholder="مثال: عقد استشارة قانونية"
          required
        >
      </div>

      <div class="field">
        <label for="lawyer_id">المحامي المسؤول</label>
        <div class="hint">حدد المحامي المسؤول عن متابعة هذا العقد</div>
        <select class="input" id="lawyer_id" name="lawyer_id" required>
          <option value="">يرجى اختيار المحامي المسؤول</option>
          <?php foreach ($lawyers as $l): ?>
            <option value="<?= (int)$l['id'] ?>" <?= (string)$lawyer_id === (string)$l['id'] ? 'selected' : '' ?>>
              <?= h($l['full_name'] ?? '') ?>
            </option>
          <?php endforeach; ?>
        </select>
      </div>

      <div class="field">
        <label for="client_id">الطرف الأول / العميل</label>
        <div class="hint">اختر العميل المرتبط بهذا العقد</div>
        <select class="input" id="client_id" name="client_id" required>
          <option value="">يرجى اختيار العميل</option>
          <?php foreach ($clients as $client): ?>
            <option value="<?= (int)$client['id'] ?>" <?= (string)$client_id === (string)$client['id'] ? 'selected' : '' ?>>
              <?= h($client['name'] ?? '') ?>
            </option>
          <?php endforeach; ?>
        </select>
      </div>

      <div class="field">
        <label for="status">الحالة التعاقدية</label>
        <div class="hint">حدد الوضع الحالي للعقد داخل النظام</div>
        <select class="input contract-select searchable" id="status" name="status">
          <option value="مسودة" <?= $status === 'مسودة' ? 'selected' : '' ?>>مسودة أولية</option>
          <option value="قيد المراجعة" <?= $status === 'قيد المراجعة' ? 'selected' : '' ?>>قيد المراجعة القانونية</option>
          <option value="ساري" <?= $status === 'ساري' ? 'selected' : '' ?>>ساري المفعول</option>
          <option value="منتهي" <?= $status === 'منتهي' ? 'selected' : '' ?>>منتهي</option>
          <option value="ملغي" <?= $status === 'ملغي' ? 'selected' : '' ?>>ملغي</option>
        </select>
      </div>

      <div class="field">
        <label for="contract_type_id">التصنيف التعاقدي</label>
        <div class="hint">اختر نوع أو تصنيف هذا العقد</div>
        <select class="input contract-select searchable" id="contract_type_id" name="contract_type_id">
          <option value="">يرجى اختيار التصنيف التعاقدي</option>
          <?php foreach ($types as $t): ?>
            <option value="<?= (int)$t['id'] ?>" <?= (string)$contract_type_id === (string)$t['id'] ? 'selected' : '' ?>>
              <?= h($t['type_name'] ?? $t['contract_name'] ?? '') ?>
            </option>
          <?php endforeach; ?>
        </select>
      </div>

      <div class="field">
        <label for="start_date">تاريخ بدء السريان</label>
        <div class="hint">التاريخ الذي يبدأ فيه العقد قانونياً</div>
        <input class="input" id="start_date" type="date" name="start_date" value="<?= h($start_date) ?>">
      </div>

      <div class="field">
        <label for="end_date">تاريخ انتهاء السريان</label>
        <div class="hint">التاريخ المتوقع لانتهاء العقد</div>
        <input class="input" id="end_date" type="date" name="end_date" value="<?= h($end_date) ?>">
      </div>

      <div class="contract-full">
        <label for="contract_html">نص العقد</label>
        <div class="field-help">اكتب أو الصق نص العقد هنا. سيتم حفظه لعرضه لاحقًا في صفحة التوقيع الإلكتروني.</div>
        <textarea
          class="input"
          id="contract_html"
          name="contract_html"
          placeholder="اكتب هنا نص العقد الكامل..."
        ><?= h($contract_html) ?></textarea>
        <div class="editor-note">يمكنك لصق نص من Word أو كتابة صياغة العقد مباشرة. إذا كان جدول العقود يحتوي contract_html فسيتم حفظه تلقائياً.</div>
      </div>

      <div class="field contract-full">
        <label for="contract_files">ملفات العقد</label>
        <div class="hint">يمكنك رفع نسخة العقد أو أي مستندات مرتبطة به</div>
        <input
          type="file"
          id="contract_files"
          name="contract_files[]"
          class="input"
          multiple
          accept=".pdf,.doc,.docx,.jpg,.jpeg,.png,.zip"
        >
      </div>
    </div>

    <div class="contract-actions">
      <button class="btn" type="submit">حفظ واعتماد العقد</button>
      <a href="index.php" class="btn ghost">العودة إلى قائمة العقود</a>
    </div>
  </form>
</div>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tom-select@2.3.1/dist/css/tom-select.css">
<script src="https://cdn.jsdelivr.net/npm/tom-select@2.3.1/dist/js/tom-select.complete.min.js"></script>

<script>
document.addEventListener('DOMContentLoaded', function () {
  const selects = [
    { id: 'client_id',        placeholder: 'ابحث باسم العميل...' },
    { id: 'lawyer_id',        placeholder: 'ابحث باسم المحامي...' },
    { id: 'status',           placeholder: 'ابحث بالحالة...' },
    { id: 'contract_type_id', placeholder: 'ابحث بالتصنيف التعاقدي...' }
  ];

  selects.forEach(function (item) {
    const el = document.getElementById(item.id);

    if (el) {
      new TomSelect(el, {
        create: false,
        maxOptions: 500,
        placeholder: item.placeholder,
        searchField: ['text'],
        allowEmptyOption: true,
        closeAfterSelect: true,
        sortField: {
          field: 'text',
          direction: 'asc'
        },
        render: {
          no_results: function () {
            return '<div class="no-results">لا توجد نتائج</div>';
          }
        }
      });
    }
  });
});
</script>

<?php render_layout_end(); ?>