<?php
declare(strict_types=1);

$root = dirname(__DIR__);
$dbPath = getenv('SQLITE_DB_PATH') ?: $root . '/data/saleos_demo.sqlite';

if (!is_dir(dirname($dbPath))) {
    mkdir(dirname($dbPath), 0775, true);
}
if (is_file($dbPath)) {
    unlink($dbPath);
}

$pdo = new PDO('sqlite:' . $dbPath);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->exec('PRAGMA foreign_keys = ON');

$schema = [
    "CREATE TABLE config (`key` TEXT PRIMARY KEY, value TEXT, updated_at TEXT DEFAULT CURRENT_TIMESTAMP)",
    "CREATE TABLE users (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        didar_user_id TEXT UNIQUE NOT NULL,
        email TEXT UNIQUE NOT NULL,
        first_name TEXT,
        last_name TEXT,
        display_name TEXT,
        username TEXT UNIQUE,
        password TEXT,
        role TEXT DEFAULT 'agent',
        is_active INTEGER DEFAULT 1,
        api_key TEXT,
        last_sync TEXT,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE persons (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        didar_contact_id TEXT UNIQUE NOT NULL,
        owner_didar_id TEXT,
        previous_owner_id TEXT,
        previous_owner_history TEXT,
        code TEXT,
        customer_code TEXT UNIQUE,
        first_name TEXT,
        last_name TEXT,
        mobile_phone TEXT,
        secondary_mobile_phone TEXT,
        mobile_phone_3 TEXT,
        mobile_phone_4 TEXT,
        work_phone TEXT,
        email TEXT,
        contact_type TEXT,
        city TEXT,
        job_title TEXT,
        job_description TEXT,
        acquaintance_source TEXT,
        acquaintance_detail TEXT,
        acquaintance_duration TEXT,
        content_topic TEXT,
        created_by_didar_id TEXT,
        created_by_name TEXT,
        created_via TEXT,
        national_id TEXT,
        has_previous_purchase INTEGER DEFAULT 0,
        sale_status INTEGER DEFAULT 0,
        birth_date TEXT,
        register_time_jalali TEXT,
        register_time TEXT,
        visibility_type TEXT,
        background_info TEXT,
        extra_info TEXT,
        customer_products TEXT,
        financial_level TEXT,
        asset_estimation TEXT,
        income_estimation TEXT,
        requested_services TEXT,
        customer_level TEXT,
        customer_level_notes TEXT,
        lead_pool_id INTEGER,
        pool_entered_at TEXT,
        pool_reason TEXT,
        last_sync TEXT,
        raw_json TEXT,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE deals (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        didar_deal_id TEXT UNIQUE NOT NULL,
        owner_didar_id TEXT,
        contact_didar_id TEXT,
        person_id INTEGER,
        title TEXT,
        code TEXT,
        status TEXT,
        pipeline_stage TEXT,
        failure_reason_code TEXT,
        failure_reason_text TEXT,
        failure_reason_description TEXT,
        pipeline_stage_id TEXT,
        pipeline_stage_title TEXT,
        estimated_price REAL,
        final_price REAL,
        probability INTEGER,
        is_paid INTEGER DEFAULT 0,
        payment_short_link TEXT,
        service_name TEXT,
        service_cost REAL,
        price_list_code TEXT,
        has_discount INTEGER DEFAULT 0,
        discount_type TEXT,
        discount_occasion TEXT,
        discount_amount REAL DEFAULT 0,
        refund_amount REAL DEFAULT 0,
        refund_description TEXT,
        payable_amount REAL,
        payment_conditions TEXT,
        invoice_code TEXT UNIQUE,
        payment_amount REAL DEFAULT 0,
        payment_method TEXT,
        payment_description TEXT,
        payments TEXT,
        requested_services TEXT,
        acquaintance_source TEXT,
        acquaintance_detail TEXT,
        content_topic TEXT,
        is_legacy_didar INTEGER DEFAULT 0,
        pipeline_bucket TEXT DEFAULT 'active',
        parked_from_stage TEXT,
        parked_at TEXT,
        parked_by_didar_id TEXT,
        parked_reason TEXT,
        park_count INTEGER DEFAULT 0,
        city TEXT,
        job_title TEXT,
        job_description TEXT,
        acquaintance_duration TEXT,
        extra_info TEXT,
        financial_level TEXT,
        asset_estimation TEXT,
        income_estimation TEXT,
        has_previous_purchase INTEGER,
        register_time TEXT,
        last_update_time TEXT,
        won_time TEXT,
        lost_time TEXT,
        visibility_type TEXT,
        last_sync TEXT,
        raw_json TEXT,
        created_by_didar_id TEXT,
        created_by_name TEXT,
        created_via TEXT,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE activities (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        didar_activity_id TEXT UNIQUE NOT NULL,
        activity_type_id TEXT NOT NULL,
        activity_type_title TEXT,
        owner_didar_id TEXT,
        activity_owner_didar_id TEXT,
        activity_owner_name_snapshot TEXT,
        activity_owner_locked_at TEXT,
        deal_didar_id TEXT,
        contact_didar_id TEXT,
        title TEXT,
        note TEXT,
        result_note TEXT,
        failure_reason_code TEXT,
        failure_reason_description TEXT,
        is_done INTEGER DEFAULT 0,
        due_date TEXT,
        done_date TEXT,
        duration INTEGER,
        call_type TEXT,
        activity_category TEXT,
        direction TEXT,
        stage TEXT,
        is_scheduled INTEGER DEFAULT 0,
        reminder_enabled INTEGER DEFAULT 0,
        register_date TEXT,
        last_update_time TEXT,
        last_sync TEXT,
        raw_json TEXT,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE virtual_stages (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        contact_didar_id TEXT NOT NULL,
        stage_name TEXT,
        entered_at TEXT DEFAULT CURRENT_TIMESTAMP,
        last_activity_id TEXT,
        notes TEXT,
        UNIQUE(contact_didar_id, stage_name)
    )",
    "CREATE TABLE lookup_groups (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        code TEXT UNIQUE NOT NULL,
        title TEXT NOT NULL,
        description TEXT,
        sort_order INTEGER DEFAULT 0,
        is_active INTEGER DEFAULT 1,
        is_system INTEGER DEFAULT 0,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP,
        updated_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE lookup_items (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        group_id INTEGER NOT NULL,
        parent_id INTEGER,
        code TEXT,
        title TEXT NOT NULL,
        value TEXT,
        meta_json TEXT,
        sort_order INTEGER DEFAULT 0,
        is_active INTEGER DEFAULT 1,
        is_visible INTEGER DEFAULT 1,
        is_system INTEGER DEFAULT 0,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP,
        updated_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE products (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        name TEXT NOT NULL,
        sku TEXT,
        price REAL DEFAULT 0,
        price_list_code TEXT,
        category TEXT,
        is_active INTEGER DEFAULT 1,
        sort_order INTEGER DEFAULT 0,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP,
        updated_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE deal_products (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        deal_id INTEGER NOT NULL,
        product_id INTEGER NOT NULL,
        product_name_snapshot TEXT,
        amount_snapshot REAL DEFAULT 0,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE transactions (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        deal_id INTEGER,
        amount REAL NOT NULL,
        payment_date TEXT,
        method TEXT,
        card_last4 TEXT,
        destination_bank TEXT,
        description TEXT,
        payer_name TEXT,
        receipt_image_path TEXT,
        check_bank_name TEXT,
        check_date TEXT,
        check_number TEXT,
        check_owner_name TEXT,
        check_due_date TEXT,
        check_delivery_date TEXT,
        check_recipient_name TEXT,
        check_status TEXT DEFAULT 'pending',
        check_status_note TEXT,
        collection_status TEXT DEFAULT 'pending',
        collection_date TEXT,
        sepidar_registered_at TEXT,
        registered_by TEXT,
        payment_owner_didar_id TEXT,
        payment_owner_name_snapshot TEXT,
        commission_status TEXT DEFAULT 'PENDING',
        commission_effective_date TEXT,
        destination_tafsili_code TEXT,
        is_first_payment INTEGER DEFAULT 0,
        payment_sequence INTEGER DEFAULT 1,
        payment_screen_at TEXT,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE notifications (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        user_id INTEGER,
        title TEXT,
        message TEXT,
        type TEXT,
        is_read INTEGER DEFAULT 0,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP,
        read_at TEXT
    )",
    "CREATE TABLE activity_reminders (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        activity_id INTEGER,
        user_id INTEGER,
        reminder_time TEXT,
        reminder_sent INTEGER DEFAULT 0,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE audit_logs (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        actor_user_id INTEGER,
        actor_didar_id TEXT,
        actor_name TEXT,
        actor_ip TEXT,
        action TEXT NOT NULL,
        entity_type TEXT NOT NULL,
        entity_id TEXT,
        related_person_didar_id TEXT,
        snapshot_json TEXT,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
    "CREATE TABLE field_audit_logs (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        entity_type TEXT,
        entity_id TEXT,
        field_name TEXT,
        old_value TEXT,
        new_value TEXT,
        actor_didar_id TEXT,
        actor_name TEXT,
        created_at TEXT DEFAULT CURRENT_TIMESTAMP
    )",
];

foreach ($schema as $sql) {
    $pdo->exec($sql);
}

$pdo->exec("CREATE INDEX idx_persons_owner ON persons(owner_didar_id)");
$pdo->exec("CREATE INDEX idx_deals_owner ON deals(owner_didar_id)");
$pdo->exec("CREATE INDEX idx_deals_contact ON deals(contact_didar_id)");
$pdo->exec("CREATE INDEX idx_activities_contact ON activities(contact_didar_id)");

$config = $pdo->prepare("INSERT INTO config (`key`, value) VALUES (?, ?)");
foreach ([
    'app_name' => 'SaleOs',
    'setup_completed' => '1',
    'auto_migration_enabled' => '0',
    'didar_write_enabled' => '0',
] as $key => $value) {
    $config->execute([$key, $value]);
}

$password = password_hash('demo123', PASSWORD_DEFAULT);
$users = [
    ['demo_admin', 'admin@saleos.demo', 'مدیر', 'سیستم', 'مدیر سیستم SaleOs', 'admin', 'admin'],
    ['demo_manager', 'manager@saleos.demo', 'مینا', 'رحیمی', 'مینا رحیمی', 'mina', 'sales_manager'],
    ['demo_agent_1', 'ava@saleos.demo', 'آوا', 'کریمی', 'آوا کریمی', 'ava', 'agent'],
    ['demo_agent_2', 'sina@saleos.demo', 'سینا', 'مرادی', 'سینا مرادی', 'sina', 'agent'],
    ['demo_support', 'support@saleos.demo', 'نیکا', 'پشتیبان', 'نیکا پشتیبان', 'support', 'support'],
    ['demo_accounting', 'finance@saleos.demo', 'امید', 'مالی', 'امید مالی', 'finance', 'accountant'],
];
$userStmt = $pdo->prepare("INSERT INTO users (didar_user_id, email, first_name, last_name, display_name, username, password, role, is_active, last_sync) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, datetime('now'))");
foreach ($users as $user) {
    $userStmt->execute([$user[0], $user[1], $user[2], $user[3], $user[4], $user[5], $password, $user[6]]);
}

$groups = [
    'pipeline_stages' => ['مراحل کاریز', ['لید جدید', 'تماس گرفته شد', 'ارسال پیشنهاد', 'مذاکره', 'پیگیری پرداخت', 'تحویل شده']],
    'allowed_services' => ['خدمات مجاز', ['راه‌اندازی سامانه فروش', 'آموزش فروش', 'کارگاه اتوماسیون', 'پشتیبانی ماهانه', 'طراحی قیف فروش', 'تحلیل داده فروش', 'یکپارچه‌سازی مالی', 'مشاوره رشد فروش']],
    'payment_methods' => ['روش‌های پرداخت', ['انتقال کارت', 'حواله بانکی', 'نقدی', 'چک', 'درگاه آنلاین', 'کارت‌خوان']],
    'payment_destination_banks' => ['بانک‌های مقصد', ['بانک نمونه یک', 'بانک نمونه دو', 'بانک نمونه سه', 'حساب خزانه']],
    'customer_levels' => ['سطح مشتری', ['طلایی', 'نقره‌ای', 'برنزی']],
    'failure_reasons' => ['دلایل شکست', ['بودجه به تعویق افتاد', 'انتخاب رقیب', 'عدم پاسخگویی', 'عدم تناسب نیاز']],
];
$groupStmt = $pdo->prepare("INSERT INTO lookup_groups (code, title, sort_order, is_system) VALUES (?, ?, ?, 1)");
$itemStmt = $pdo->prepare("INSERT INTO lookup_items (group_id, code, title, value, meta_json, sort_order, is_system) VALUES (?, ?, ?, ?, ?, ?, 1)");
$sort = 1;
foreach ($groups as $code => $group) {
    $groupStmt->execute([$code, $group[0], $sort++]);
    $groupId = (int)$pdo->lastInsertId();
    $itemSort = 1;
    foreach ($group[1] as $item) {
        $meta = null;
        if ($code === 'allowed_services') {
            $meta = json_encode(['price' => 15000000 + ($itemSort * 3500000), 'price_list_code' => 'DEMO-' . $itemSort], JSON_UNESCAPED_UNICODE);
        }
        $itemStmt->execute([$groupId, strtolower(str_replace(' ', '_', $item)), $item, $item, $meta, $itemSort++]);
    }
}

$productStmt = $pdo->prepare("INSERT INTO products (name, sku, price, price_list_code, category, sort_order) VALUES (?, ?, ?, ?, ?, ?)");
$products = [
    ['راه‌اندازی سامانه فروش', 'DEMO-SALES', 18500000, 'DEMO-1', 'خدمت'],
    ['آموزش فروش', 'DEMO-TRAIN', 22000000, 'DEMO-2', 'آموزش'],
    ['کارگاه اتوماسیون', 'DEMO-AUTO', 27000000, 'DEMO-3', 'کارگاه'],
    ['پشتیبانی ماهانه', 'DEMO-SUPPORT', 15000000, 'DEMO-4', 'پشتیبانی'],
    ['طراحی قیف فروش', 'DEMO-FUNNEL', 32000000, 'DEMO-5', 'مشاوره'],
    ['تحلیل داده فروش', 'DEMO-DATA', 38000000, 'DEMO-6', 'تحلیل'],
    ['یکپارچه‌سازی مالی', 'DEMO-FIN', 42000000, 'DEMO-7', 'مالی'],
    ['مشاوره رشد فروش', 'DEMO-GROWTH', 30000000, 'DEMO-8', 'مشاوره'],
];
foreach ($products as $i => $product) {
    $productStmt->execute([$product[0], $product[1], $product[2], $product[3], $product[4], $i + 1]);
}

$firstNames = [
    'آرمان', 'دریا', 'کیان', 'رها', 'نوید', 'تارا', 'پویا', 'لنا', 'یاسمن', 'سام',
    'مهسا', 'مانی', 'باران', 'هستی', 'پارسا', 'نگار', 'شایان', 'الناز', 'امیر', 'نیلوفر',
    'حسام', 'پرنیا', 'سارا', 'بردیا', 'مریم', 'آریا', 'ریحانه', 'سپهر', 'ترانه', 'فرهاد'
];
$lastNames = [
    'احمدی', 'صادقی', 'نوری', 'ابراهیمی', 'فرزان', 'کاظمی', 'شایان', 'عظیمی', 'رستمی', 'مهر',
    'محمدی', 'رضایی', 'کریمی', 'مرادی', 'جعفری', 'حسینی', 'اکبری', 'رحمانی', 'یزدانی', 'قاسمی'
];
$owners = ['demo_agent_1', 'demo_agent_2', 'demo_manager'];
$ownerNames = [
    'demo_agent_1' => 'آوا کریمی',
    'demo_agent_2' => 'سینا مرادی',
    'demo_manager' => 'مینا رحیمی',
];
$levels = ['طلایی', 'نقره‌ای', 'برنزی'];
$stages = ['لید جدید', 'تماس گرفته شد', 'ارسال پیشنهاد', 'مذاکره', 'پیگیری پرداخت', 'تحویل شده'];
$personStmt = $pdo->prepare("INSERT INTO persons (
    didar_contact_id, owner_didar_id, code, customer_code, first_name, last_name, mobile_phone, email, contact_type, city,
    job_title, acquaintance_source, created_by_didar_id, created_by_name, created_via, national_id, has_previous_purchase,
    sale_status, register_time, visibility_type, customer_products, financial_level, requested_services, customer_level,
    last_sync, raw_json
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'lead', ?, ?, ?, 'demo_admin', 'مدیر سیستم SaleOs', 'demo_seed', ?, ?, ?, ?, 'public', ?, ?, ?, ?, datetime('now'), '{}')");
$stageStmt = $pdo->prepare("INSERT INTO virtual_stages (contact_didar_id, stage_name, notes) VALUES (?, ?, ?)");
$activityStmt = $pdo->prepare("INSERT INTO activities (
    didar_activity_id, activity_type_id, activity_type_title, owner_didar_id, activity_owner_didar_id, activity_owner_name_snapshot,
    contact_didar_id, title, note, result_note, is_done, due_date, done_date, duration, call_type, activity_category,
    direction, stage, register_date, last_sync, raw_json
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now'), '{}')");

for ($i = 1; $i <= 420; $i++) {
    $first = $firstNames[($i - 1) % count($firstNames)];
    $last = $lastNames[(int)(($i - 1) / count($firstNames)) % count($lastNames)];
    $owner = $owners[$i % count($owners)];
    $product = $products[$i % count($products)][0];
    $daysAgo = ($i - 1) % 90;
    $registered = date('Y-m-d H:i:s', strtotime("-{$daysAgo} days " . (9 + ($i % 8)) . ":00:00"));
    $contactId = sprintf('demo_contact_%03d', $i);
    $saleStatus = ($i % 2 === 0 || $i % 5 === 0 || $i % 11 === 0) ? 1 : 0;
    $personStmt->execute([
        $contactId,
        $owner,
        sprintf('L-%04d', $i),
        (string)(20000 + $i),
        $first,
        $last,
        '09' . str_pad((string)(120000000 + $i), 9, '0', STR_PAD_LEFT),
        'customer' . $i . '@saleos.demo',
        ['تهران', 'شیراز', 'اصفهان', 'تبریز'][$i % 4],
        ['بنیان‌گذار', 'مدیر فروش', 'مدیر عملیات', 'مشاور'][$i % 4],
        ['وب‌سایت', 'معرفی مشتری', 'رویداد', 'شبکه اجتماعی'][$i % 4],
        '0099' . str_pad((string)$i, 6, '0', STR_PAD_LEFT),
        $i % 3 === 0 ? 1 : 0,
        $saleStatus,
        $registered,
        $saleStatus ? $product : '',
        ['بالا', 'متوسط', 'در حال رشد'][$i % 3],
        json_encode([$product], JSON_UNESCAPED_UNICODE),
        $levels[$i % 3],
    ]);
    $stageStmt->execute([$contactId, $stages[$i % count($stages)], 'مرحله نمونه دمو']);

    for ($a = 1; $a <= 4; $a++) {
        $activityStmt->execute([
            sprintf('demo_activity_%03d_%d', $i, $a),
            $a === 1 ? 'call_out' : ($a === 2 ? 'followup' : ($a === 3 ? 'meeting' : 'message')),
            $a === 1 ? 'تماس خروجی' : ($a === 2 ? 'پیگیری' : ($a === 3 ? 'جلسه مشاوره' : 'پیامک')),
            $owner,
            $owner,
            $owner,
            $contactId,
            $a === 1 ? 'تماس معرفی' : ($a === 2 ? 'پیگیری پیشنهاد' : ($a === 3 ? 'جلسه بررسی نیاز' : 'ارسال پیام یادآوری')),
            $a === 1 ? 'نیاز و بودجه مشتری بررسی شد.' : ($a === 2 ? 'پیشنهاد برای مشتری ارسال و پیگیری شد.' : ($a === 3 ? 'جزئیات اجرا با مشتری مرور شد.' : 'پیام یادآوری برای تصمیم‌گیری ارسال شد.')),
            $a === 1 ? 'علاقه‌مند' : ($a === 2 ? 'در انتظار تصمیم' : ($a === 3 ? 'نیازمند بررسی مالی' : 'منتظر پاسخ')),
            $a <= 3 ? 1 : 0,
            date('Y-m-d H:i:s', strtotime("-" . max(0, $i - $a) . " days 12:00:00")),
            $a === 1 ? date('Y-m-d H:i:s', strtotime("-" . max(0, $i - $a) . " days 12:30:00")) : null,
            15 + $a * 5,
            'فروش',
            'تماس',
            'خروجی',
            $stages[$i % count($stages)],
            date('Y-m-d H:i:s', strtotime("-" . max(0, $i - $a) . " days 11:00:00")),
        ]);
    }
}

$dealStmt = $pdo->prepare("INSERT INTO deals (
    didar_deal_id, owner_didar_id, contact_didar_id, person_id, title, code, status, pipeline_stage,
    failure_reason_text,
    estimated_price, final_price, probability, is_paid, service_name, service_cost, price_list_code,
    payable_amount, invoice_code, payment_amount, payment_method, payments, requested_services,
    acquaintance_source, is_legacy_didar, pipeline_bucket, parked_from_stage, parked_at, parked_reason,
    register_time, won_time, lost_time, visibility_type, last_sync, raw_json, created_by_didar_id, created_by_name, created_via
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?, ?, ?, 'public', datetime('now'), '{}', 'demo_admin', 'مدیر سیستم SaleOs', 'demo_seed')");
$dealProductStmt = $pdo->prepare("INSERT INTO deal_products (deal_id, product_id, product_name_snapshot, amount_snapshot) VALUES (?, ?, ?, ?)");
$txStmt = $pdo->prepare("INSERT INTO transactions (
    deal_id, amount, payment_date, method, card_last4, destination_bank, description, payer_name, receipt_image_path,
    check_bank_name, check_date, check_number, check_owner_name, check_due_date, check_delivery_date, check_recipient_name,
    check_status, check_status_note, collection_status, collection_date, sepidar_registered_at, registered_by,
    payment_owner_didar_id, payment_owner_name_snapshot, commission_status, commission_effective_date, destination_tafsili_code,
    is_first_payment, payment_sequence, payment_screen_at
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");

for ($i = 1; $i <= 360; $i++) {
    $personId = (($i - 1) % 420) + 1;
    $person = $pdo->query("SELECT * FROM persons WHERE id = {$personId}")->fetch();
    $productId = (($i - 1) % count($products)) + 1;
    $product = $products[$productId - 1];
    $status = $i % 9 === 0 ? 'Lost' : ($i % 4 === 0 || $i % 7 === 0 ? 'Won' : 'Pending');
    $amount = (float)$product[2] + (($i % 5) * 1200000);
    $paid = 0.0;
    if ($status === 'Won') {
        $paid = $amount;
    } elseif ($status === 'Pending' && $i % 2 === 0) {
        $paid = round($amount * (0.25 + (($i % 4) * 0.15)));
    } elseif ($status === 'Lost' && $i % 3 === 0) {
        $paid = round($amount * 0.18);
    }
    $bucket = $i % 11 === 0 ? 'parked' : 'active';
    $stage = $stages[$i % count($stages)];
    $failureReason = ['بودجه به تعویق افتاد', 'انتخاب رقیب', 'عدم پاسخگویی', 'عدم تناسب نیاز'][$i % 4];
    $daysAgo = ($i - 1) % 90;
    $registered = date('Y-m-d H:i:s', strtotime("-{$daysAgo} days " . (8 + ($i % 9)) . ":30:00"));
    $paymentsPayload = [];
    $dealStmt->execute([
        sprintf('demo_deal_%03d', $i),
        $person['owner_didar_id'],
        $person['didar_contact_id'],
        $personId,
        $product[0] . ' برای ' . $person['first_name'] . ' ' . $person['last_name'],
        sprintf('D-%04d', $i),
        $status,
        $stage,
        $status === 'Lost' ? $failureReason : null,
        $amount,
        $amount,
        $status === 'Won' ? 100 : ($status === 'Lost' ? 0 : 55 + ($i % 30)),
        $paid > 0 ? 1 : 0,
        $product[0],
        $product[2],
        $product[3],
        $amount,
        sprintf('INV-%04d', $i),
        $paid,
        $paid > 0 ? ['انتقال کارت', 'حواله بانکی', 'نقدی', 'چک', 'درگاه آنلاین', 'کارت‌خوان'][$i % 6] : null,
        '[]',
        json_encode([$product[0]], JSON_UNESCAPED_UNICODE),
        ['وب‌سایت', 'معرفی مشتری', 'رویداد', 'شبکه اجتماعی'][$i % 4],
        $bucket,
        $bucket === 'parked' ? $stage : null,
        $bucket === 'parked' ? date('Y-m-d H:i:s', strtotime("-2 days")) : null,
        $bucket === 'parked' ? 'در انتظار مدارک مشتری' : null,
        $registered,
        $status === 'Won' ? date('Y-m-d H:i:s', strtotime("-" . max(1, $i - 2) . " days")) : null,
        $status === 'Lost' ? date('Y-m-d H:i:s', strtotime("-" . max(1, $i - 1) . " days")) : null,
    ]);
    $dealId = (int)$pdo->lastInsertId();
    $dealProductStmt->execute([$dealId, $productId, $product[0], $amount]);
    if ($paid > 0) {
        $chunks = $status === 'Won'
            ? [round($paid * 0.35), round($paid * 0.40), $paid - round($paid * 0.35) - round($paid * 0.40)]
            : ($paid > $amount * 0.4 ? [round($paid * 0.55), $paid - round($paid * 0.55)] : [$paid]);
        $methods = ['انتقال کارت', 'حواله بانکی', 'نقدی', 'چک', 'درگاه آنلاین', 'کارت‌خوان'];
        foreach ($chunks as $seq => $chunk) {
            if ($chunk <= 0) {
                continue;
            }
            $method = $methods[($i + $seq) % count($methods)];
            if ($seq === 1 && $i % 2 === 0) {
                $method = 'چک';
            }
            $paymentDate = date('Y-m-d', strtotime($registered . ' +' . (1 + $seq * 7) . ' days'));
            if ($paymentDate > date('Y-m-d')) {
                $paymentDate = date('Y-m-d', strtotime('-' . (($i + $seq) % 12) . ' days'));
            }
            $isCheque = $method === 'چک';
            $chequeStatus = $isCheque ? ['approved', 'approved', 'pending', 'rejected'][$i % 4] : 'not_cheque';
            $collectionStatus = 'not_cheque';
            $collectionDate = null;
            if ($isCheque) {
                $collectionStatus = ['collected', 'returned', 'blataklif', 'pending'][$i % 4];
                $collectionDate = $collectionStatus === 'collected' ? date('Y-m-d', strtotime($paymentDate . ' +10 days')) : null;
                if ($collectionDate && $collectionDate > date('Y-m-d')) {
                    $collectionDate = date('Y-m-d', strtotime('-1 day'));
                }
            }
            $sepidarAt = (($i + $seq) % 3 === 0 || $collectionStatus === 'collected')
                ? date('Y-m-d H:i:s', strtotime($paymentDate . ' 16:10:00'))
                : null;
            $commissionStatus = ['PENDING', 'CALCULATED', 'APPROVED', 'READY_FOR_PAYOUT', 'PAID'][($i + $seq) % 5];
            $bank = ['بانک نمونه یک', 'بانک نمونه دو', 'بانک نمونه سه', 'حساب خزانه'][($i + $seq) % 4];
            $paymentsPayload[] = ['amount' => $chunk, 'date' => $paymentDate, 'method' => $method];
            $txStmt->execute([
                $dealId,
                $chunk,
                $paymentDate,
                $method,
                $method === 'انتقال کارت' || $method === 'کارت‌خوان' ? str_pad((string)(1000 + (($i + $seq) % 8999)), 4, '0', STR_PAD_LEFT) : null,
                $bank,
                $isCheque ? 'چک نمونه برای تست وضعیت وصول' : 'پرداخت نمونه دمو',
                $person['first_name'] . ' ' . $person['last_name'],
                $isCheque ? '/uploads/demo/cheque-' . $i . '-' . ($seq + 1) . '.jpg' : '/uploads/demo/receipt-' . $i . '-' . ($seq + 1) . '.jpg',
                $isCheque ? ['بانک ملت', 'بانک تجارت', 'بانک ملی', 'بانک پاسارگاد'][($i + $seq) % 4] : null,
                $isCheque ? $paymentDate : null,
                $isCheque ? str_pad((string)(100000 + $i + $seq), 6, '0', STR_PAD_LEFT) : null,
                $isCheque ? $person['first_name'] . ' ' . $person['last_name'] : null,
                $isCheque ? date('Y-m-d', strtotime($paymentDate . ' +30 days')) : null,
                $isCheque ? date('Y-m-d', strtotime($paymentDate . ' +1 day')) : null,
                $isCheque ? 'واحد مالی SaleOs' : null,
                $chequeStatus,
                $isCheque && $chequeStatus === 'rejected' ? 'اطلاعات چک ناقص بود' : null,
                $collectionStatus,
                $collectionDate,
                $sepidarAt,
                $sepidarAt ? 'امید مالی' : null,
                $person['owner_didar_id'],
                $ownerNames[$person['owner_didar_id']] ?? $person['owner_didar_id'],
                $commissionStatus,
                $paymentDate,
                'TF-' . str_pad((string)(100 + (($i + $seq) % 50)), 3, '0', STR_PAD_LEFT),
                $seq === 0 ? 1 : 0,
                $seq + 1,
                date('Y-m-d H:i:s', strtotime($paymentDate . ' ' . (11 + $seq) . ':20:00')),
            ]);
        }
        $updatePayments = $pdo->prepare("UPDATE deals SET payments = ? WHERE id = ?");
        $updatePayments->execute([json_encode($paymentsPayload, JSON_UNESCAPED_UNICODE), $dealId]);
    }
}

$pdo->exec("INSERT INTO notifications (user_id, title, message, type, is_read) VALUES (1, 'به دمو SaleOs خوش آمدید', 'این پایگاه داده فقط شامل داده‌های ساختگی دمو است.', 'info', 0)");

echo "Seeded SaleOs demo SQLite database: {$dbPath}\n";
echo "Login: admin@saleos.demo / demo123\n";
