<?php
/**
 * Chat Migration Script
 * این فایل یک‌بار اجرا کنید تا جداول چت به‌روز شوند
 * آدرس: http://localhost/acc-engine/run-chat-migrate.php
 * پس از اجرای موفق این فایل را حذف یا rename کنید
 */

declare(strict_types=1);

// اتصال به DB از config
require_once __DIR__ . '/standalone/config.php';

try {
    $pdo = new PDO(
        ACC_DB_DSN,
        ACC_DB_USER,
        ACC_DB_PASS,
        [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]
    );
    $pdo->exec("SET NAMES utf8mb4");
} catch (Throwable $e) {
    die("❌ اتصال به پایگاه داده شکست: " . $e->getMessage());
}

$prefix  = ACC_DB_PREFIX;
$charset = "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
$results = [];

function run_sql(PDO $pdo, string $label, string $sql): void {
    global $results;
    try {
        $pdo->exec($sql);
        $results[] = ['ok', $label];
    } catch (Throwable $e) {
        $results[] = ['err', $label . ': ' . $e->getMessage()];
    }
}

function col_exists(PDO $pdo, string $table, string $col): bool {
    $stmt = $pdo->query("SHOW COLUMNS FROM `{$table}` LIKE '{$col}'");
    return (bool) $stmt->fetch();
}

function table_exists(PDO $pdo, string $table): bool {
    $stmt = $pdo->prepare("SHOW TABLES LIKE ?");
    $stmt->execute([$table]);
    return (bool) $stmt->fetch();
}

// ─────────────────────────────────────────────────────────────────────────────
// ۱. ایجاد جدول chat_conversations (اگر وجود ندارد)
// ─────────────────────────────────────────────────────────────────────────────
if (!table_exists($pdo, $prefix . 'chat_conversations')) {
    run_sql($pdo, 'ایجاد جدول chat_conversations',
        "CREATE TABLE `{$prefix}chat_conversations` (
            id             BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
            visitor_id     VARCHAR(64)     NOT NULL,
            tracking_code  VARCHAR(6)      NOT NULL DEFAULT '',
            agent_id       BIGINT UNSIGNED NULL,
            status         ENUM('open','pending','closed') NOT NULL DEFAULT 'open',
            source         VARCHAR(50)     NOT NULL DEFAULT 'website',
            created_at     DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
            updated_at     DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            PRIMARY KEY (id),
            UNIQUE KEY tracking_code (tracking_code),
            KEY visitor_id (visitor_id),
            KEY status (status),
            KEY updated_at (updated_at)
        ) {$charset}"
    );
} else {
    $results[] = ['skip', 'جدول chat_conversations از قبل وجود دارد'];
}

// ─────────────────────────────────────────────────────────────────────────────
// ۲. به‌روز کردن chat_messages
// ─────────────────────────────────────────────────────────────────────────────
$msgTable = $prefix . 'chat_messages';
if (table_exists($pdo, $msgTable)) {
    // اضافه کردن conversation_id (اگر وجود ندارد)
    if (!col_exists($pdo, $msgTable, 'conversation_id')) {
        run_sql($pdo, 'افزودن ستون conversation_id به chat_messages',
            "ALTER TABLE `{$msgTable}` ADD COLUMN `conversation_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 AFTER `id`"
        );
        // مهاجرت از room_id
        if (col_exists($pdo, $msgTable, 'room_id')) {
            run_sql($pdo, 'مهاجرت room_id → conversation_id',
                "UPDATE `{$msgTable}` SET conversation_id = room_id WHERE conversation_id = 0 AND room_id > 0"
            );
        }
        // اضافه کردن index
        run_sql($pdo, 'افزودن index روی conversation_id',
            "ALTER TABLE `{$msgTable}` ADD KEY `conversation_id` (`conversation_id`)"
        );
    } else {
        $results[] = ['skip', 'ستون conversation_id از قبل وجود دارد'];
    }

    // اضافه کردن message (اگر وجود ندارد)
    if (!col_exists($pdo, $msgTable, 'message')) {
        run_sql($pdo, 'افزودن ستون message به chat_messages',
            "ALTER TABLE `{$msgTable}` ADD COLUMN `message` TEXT NOT NULL DEFAULT '' AFTER `sender_id`"
        );
        if (col_exists($pdo, $msgTable, 'body')) {
            run_sql($pdo, 'مهاجرت body → message',
                "UPDATE `{$msgTable}` SET message = body WHERE message = '' AND body != ''"
            );
        }
    } else {
        $results[] = ['skip', 'ستون message از قبل وجود دارد'];
    }

    // تبدیل sender_id از BIGINT به VARCHAR اگر لازم است
    $colInfo = $pdo->query("SHOW COLUMNS FROM `{$msgTable}` LIKE 'sender_id'")->fetch();
    if ($colInfo && stripos($colInfo['Type'] ?? '', 'bigint') !== false) {
        run_sql($pdo, 'تبدیل sender_id به VARCHAR(64)',
            "ALTER TABLE `{$msgTable}` MODIFY COLUMN `sender_id` VARCHAR(64) NOT NULL DEFAULT '0'"
        );
    } else {
        $results[] = ['skip', 'sender_id قبلاً VARCHAR است'];
    }
} else {
    // ایجاد جدول chat_messages اگر وجود ندارد
    run_sql($pdo, 'ایجاد جدول chat_messages',
        "CREATE TABLE `{$msgTable}` (
            id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
            conversation_id BIGINT UNSIGNED NOT NULL,
            sender_type     ENUM('user','visitor','agent','system') NOT NULL DEFAULT 'user',
            sender_id       VARCHAR(64)     NOT NULL DEFAULT '0',
            message         TEXT            NOT NULL,
            created_at      DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id),
            KEY conversation_id (conversation_id),
            KEY created_at (created_at)
        ) {$charset}"
    );
}

// ─────────────────────────────────────────────────────────────────────────────
// ۳. به‌روز کردن chat_visitors
// ─────────────────────────────────────────────────────────────────────────────
$visTable = $prefix . 'chat_visitors';
if (table_exists($pdo, $visTable)) {
    // اضافه کردن visitor_id (اگر وجود ندارد)
    if (!col_exists($pdo, $visTable, 'visitor_id')) {
        run_sql($pdo, 'افزودن ستون visitor_id به chat_visitors',
            "ALTER TABLE `{$visTable}` ADD COLUMN `visitor_id` VARCHAR(64) NOT NULL DEFAULT '' AFTER `id`"
        );
        if (col_exists($pdo, $visTable, 'session_key')) {
            run_sql($pdo, 'مهاجرت session_key → visitor_id',
                "UPDATE `{$visTable}` SET visitor_id = session_key WHERE visitor_id = ''"
            );
        }
        try {
            $pdo->exec("ALTER TABLE `{$visTable}` ADD UNIQUE KEY `visitor_id` (`visitor_id`)");
            $results[] = ['ok', 'افزودن UNIQUE KEY برای visitor_id'];
        } catch (Throwable $e) {
            $results[] = ['warn', 'UNIQUE KEY: ' . $e->getMessage()];
        }
    } else {
        $results[] = ['skip', 'ستون visitor_id از قبل وجود دارد'];
    }

    // اضافه کردن ip_address
    if (!col_exists($pdo, $visTable, 'ip_address')) {
        run_sql($pdo, 'افزودن ستون ip_address به chat_visitors',
            "ALTER TABLE `{$visTable}` ADD COLUMN `ip_address` VARCHAR(45) NOT NULL DEFAULT ''"
        );
        if (col_exists($pdo, $visTable, 'ip')) {
            run_sql($pdo, 'مهاجرت ip → ip_address',
                "UPDATE `{$visTable}` SET ip_address = ip WHERE ip_address = ''"
            );
        }
    } else {
        $results[] = ['skip', 'ستون ip_address از قبل وجود دارد'];
    }

    // اضافه کردن phone
    if (!col_exists($pdo, $visTable, 'phone')) {
        run_sql($pdo, 'افزودن ستون phone به chat_visitors',
            "ALTER TABLE `{$visTable}` ADD COLUMN `phone` VARCHAR(20) NOT NULL DEFAULT '' AFTER `name`"
        );
    } else {
        $results[] = ['skip', 'ستون phone از قبل وجود دارد'];
    }

    // اضافه کردن user_agent
    if (!col_exists($pdo, $visTable, 'user_agent')) {
        run_sql($pdo, 'افزودن ستون user_agent به chat_visitors',
            "ALTER TABLE `{$visTable}` ADD COLUMN `user_agent` VARCHAR(500) NOT NULL DEFAULT ''"
        );
    } else {
        $results[] = ['skip', 'ستون user_agent از قبل وجود دارد'];
    }
} else {
    run_sql($pdo, 'ایجاد جدول chat_visitors',
        "CREATE TABLE `{$visTable}` (
            id           BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
            visitor_id   VARCHAR(64)     NOT NULL,
            name         VARCHAR(100)    NOT NULL DEFAULT 'بازدیدکننده',
            phone        VARCHAR(20)     NOT NULL DEFAULT '',
            email        VARCHAR(200)    NOT NULL DEFAULT '',
            ip_address   VARCHAR(45)     NOT NULL DEFAULT '',
            user_agent   VARCHAR(500)    NOT NULL DEFAULT '',
            created_at   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id),
            UNIQUE KEY visitor_id (visitor_id)
        ) {$charset}"
    );
}

// ─────────────────────────────────────────────────────────────────────────────
// ۴. ایجاد جدول chat_rooms (برای چت داخلی ERP)
// ─────────────────────────────────────────────────────────────────────────────
$roomsTable = $prefix . 'chat_rooms';
if (!table_exists($pdo, $roomsTable)) {
    run_sql($pdo, 'ایجاد جدول chat_rooms',
        "CREATE TABLE `{$roomsTable}` (
            id           BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
            type         ENUM('direct','group','support') NOT NULL DEFAULT 'direct',
            name         VARCHAR(200)    NOT NULL DEFAULT '',
            project_id   BIGINT UNSIGNED NULL,
            created_by   BIGINT UNSIGNED NOT NULL DEFAULT 0,
            status       ENUM('open','closed','pending') NOT NULL DEFAULT 'open',
            last_msg_at  DATETIME        NULL,
            created_at   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id),
            KEY type (type),
            KEY status (status),
            KEY last_msg_at (last_msg_at)
        ) {$charset}"
    );
} else {
    $results[] = ['skip', 'جدول chat_rooms از قبل وجود دارد'];
}

// ─────────────────────────────────────────────────────────────────────────────
// ۵. ایجاد جدول chat_participants (برای چت داخلی ERP)
// ─────────────────────────────────────────────────────────────────────────────
$partTable = $prefix . 'chat_participants';
if (!table_exists($pdo, $partTable)) {
    run_sql($pdo, 'ایجاد جدول chat_participants',
        "CREATE TABLE `{$partTable}` (
            id           BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
            room_id      BIGINT UNSIGNED NOT NULL,
            user_id      BIGINT UNSIGNED NOT NULL,
            role         ENUM('admin','member') NOT NULL DEFAULT 'member',
            last_read_at DATETIME        NULL,
            joined_at    DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
            PRIMARY KEY (id),
            UNIQUE KEY room_user (room_id, user_id),
            KEY user_id (user_id)
        ) {$charset}"
    );
} else {
    $results[] = ['skip', 'جدول chat_participants از قبل وجود دارد'];
}

// ─────────────────────────────────────────────────────────────────────────────
// ۶. بررسی منوی chat در acl_menus
// ─────────────────────────────────────────────────────────────────────────────
$menuTable = $prefix . 'acl_menus';
if (table_exists($pdo, $menuTable)) {
    $stmt = $pdo->prepare("SELECT id FROM `{$menuTable}` WHERE menu_key = 'chat'");
    $stmt->execute();
    if (!$stmt->fetch()) {
        run_sql($pdo, 'افزودن منوی چت به acl_menus',
            "INSERT INTO `{$menuTable}` (menu_key, parent_key, title, icon, route, required_permission, sort_order, is_active)
             VALUES ('chat', '', '💬 چت و پشتیبانی', '💬', 'chat', '', 15, 1)"
        );
    } else {
        $results[] = ['skip', 'منوی chat از قبل در acl_menus وجود دارد'];
    }
}

// ─────────────────────────────────────────────────────────────────────────────
// نمایش نتایج
// ─────────────────────────────────────────────────────────────────────────────
?>
<!DOCTYPE html>
<html dir="rtl" lang="fa">
<head>
<meta charset="utf-8">
<title>Chat Migration</title>
<style>
body { font-family: Tahoma, sans-serif; padding: 24px; background: #f8fafc; direction: rtl; }
h2  { color: #1e40af; }
ul  { list-style: none; padding: 0; }
li  { padding: 6px 12px; margin: 4px 0; border-radius: 6px; font-size: 14px; }
.ok   { background: #dcfce7; color: #166534; }
.err  { background: #fee2e2; color: #991b1b; }
.warn { background: #fef9c3; color: #854d0e; }
.skip { background: #f1f5f9; color: #64748b; }
.done { background: #1e40af; color: #fff; padding: 12px 20px; border-radius: 8px; margin-top: 20px; display: inline-block; }
</style>
</head>
<body>
<h2>🔧 Migration چت</h2>
<ul>
<?php foreach ($results as [$type, $msg]): ?>
    <li class="<?= $type ?>">
        <?= $type === 'ok' ? '✅' : ($type === 'err' ? '❌' : ($type === 'warn' ? '⚠️' : '⏭️')) ?>
        <?= htmlspecialchars($msg) ?>
    </li>
<?php endforeach; ?>
</ul>

<?php
$hasErrors = array_filter($results, fn($r) => $r[0] === 'err');
if (empty($hasErrors)):
?>
<p class="done">✅ Migration با موفقیت اجرا شد! اکنون می‌توانید چت را استفاده کنید.</p>
<p style="color:#94a3b8;font-size:12px;margin-top:12px;">⚠️ پس از اطمینان از کارکرد صحیح، این فایل را حذف کنید.</p>
<?php else: ?>
<p style="background:#fee2e2;padding:12px;border-radius:8px;color:#991b1b;">❌ برخی خطاها رخ داد. جزئیات بالا را بررسی کنید.</p>
<?php endif; ?>

</body>
</html>
