<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
header('Access-Control-Allow-Methods: POST, OPTIONS');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    exit;
}

$DB_HOST = 'localhost';
$DB_NAME = 'pnartli1_doorkar';
$DB_USER = 'pnartli1_doorkar';
$DB_PASS = 'V[B5S(1gO,OIqPvz';
$BASE_URL = 'https://pnartl.ir/doorkar';

function respond($success, $data = [], $message = '') {
    echo json_encode(
        array_merge([
            'success' => $success,
            'message' => $message
        ], $data),
        JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
    );
    exit;
}

function input_json() {
    $raw = file_get_contents('php://input');
    $json = json_decode($raw, true);
    return is_array($json) ? $json : [];
}

function public_url($path) {
    global $BASE_URL;
    $path = trim((string)$path);
    if ($path === '') return '';
    if (preg_match('/^https?:\/\//i', $path)) return $path;
    return rtrim($BASE_URL, '/') . '/' . ltrim($path, '/');
}

function table_exists(PDO $pdo, $table) {
    try {
        $stmt = $pdo->prepare("SHOW TABLES LIKE ?");
        $stmt->execute([$table]);
        return $stmt->fetchColumn() !== false;
    } catch (Throwable $e) {
        return false;
    }
}

function column_exists(PDO $pdo, $table, $column) {
    try {
        $stmt = $pdo->prepare("SHOW COLUMNS FROM `$table` LIKE ?");
        $stmt->execute([$column]);
        return $stmt->fetchColumn() !== false;
    } catch (Throwable $e) {
        return false;
    }
}

function count_for_user(PDO $pdo, $table, $userId) {
    if (!table_exists($pdo, $table)) return 0;

    try {
        $stmt = $pdo->prepare("SELECT COUNT(*) FROM `$table` WHERE user_id = ?");
        $stmt->execute([$userId]);
        return (int)$stmt->fetchColumn();
    } catch (Throwable $e) {
        return 0;
    }
}

function unread_count(PDO $pdo, $table, $userId) {
    if (!table_exists($pdo, $table)) return 0;

    try {
        if (column_exists($pdo, $table, 'receiver_user_id')) {
            $userColumn = 'receiver_user_id';
        } elseif (column_exists($pdo, $table, 'user_id')) {
            $userColumn = 'user_id';
        } else {
            return 0;
        }

        if (column_exists($pdo, $table, 'is_read')) {
            $stmt = $pdo->prepare("SELECT COUNT(*) FROM `$table` WHERE `$userColumn` = ? AND is_read = 0");
            $stmt->execute([$userId]);
            return (int)$stmt->fetchColumn();
        }

        if (column_exists($pdo, $table, 'read_at')) {
            $stmt = $pdo->prepare("SELECT COUNT(*) FROM `$table` WHERE `$userColumn` = ? AND read_at IS NULL");
            $stmt->execute([$userId]);
            return (int)$stmt->fetchColumn();
        }

        return 0;
    } catch (Throwable $e) {
        return 0;
    }
}

function wallet_balance(PDO $pdo, $userId) {
    if (!table_exists($pdo, 'wallet_transactions')) return 0;

    try {
        if (column_exists($pdo, 'wallet_transactions', 'amount')) {
            $stmt = $pdo->prepare("SELECT COALESCE(SUM(amount), 0) FROM wallet_transactions WHERE user_id = ?");
            $stmt->execute([$userId]);
            return (int)$stmt->fetchColumn();
        }

        return 0;
    } catch (Throwable $e) {
        return 0;
    }
}

function fetch_one(PDO $pdo, $sql, $params = []) {
    try {
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        return is_array($row) ? $row : null;
    } catch (Throwable $e) {
        return null;
    }
}

function fetch_all(PDO $pdo, $sql, $params = []) {
    try {
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        return is_array($rows) ? $rows : [];
    } catch (Throwable $e) {
        return [];
    }
}


function ensure_presence_table(PDO $pdo) {
    try {
        $pdo->exec("
            CREATE TABLE IF NOT EXISTS user_presence (
                user_id INT(11) NOT NULL,
                last_seen_at DATETIME NOT NULL,
                app_state ENUM('online','offline') NOT NULL DEFAULT 'online',
                platform VARCHAR(30) NOT NULL DEFAULT 'android',
                updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
                PRIMARY KEY (user_id),
                INDEX idx_last_seen_at (last_seen_at)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
        ");
    } catch (Throwable $e) {
        // سکوت؛ نبود دسترسی ساخت جدول نباید صفحه اصلی را از کار بیندازد.
    }
}

function upsert_presence(PDO $pdo, $userId) {
    if ($userId <= 0) return;
    ensure_presence_table($pdo);

    try {
        $stmt = $pdo->prepare("
            INSERT INTO user_presence (user_id, last_seen_at, app_state, platform)
            VALUES (?, NOW(), 'online', 'android')
            ON DUPLICATE KEY UPDATE
                last_seen_at = NOW(),
                app_state = 'online',
                platform = 'android',
                updated_at = CURRENT_TIMESTAMP
        ");
        $stmt->execute([$userId]);
    } catch (Throwable $e) {
        // سکوت؛ حضور آنلاین نباید باعث خطای داشبورد شود.
    }
}

function presence_summary(PDO $pdo, $userId) {
    ensure_presence_table($pdo);

    $row = fetch_one(
        $pdo,
        "SELECT user_id, last_seen_at, app_state FROM user_presence WHERE user_id = ? LIMIT 1",
        [$userId]
    );

    if (!$row) {
        return [
            'user_id' => (int)$userId,
            'is_online' => false,
            'status_text' => 'آفلاین',
            'last_seen_text' => 'نامشخص',
            'last_seen_at' => null
        ];
    }

    $lastSeen = (string)($row['last_seen_at'] ?? '');
    $seconds = 999999;
    if ($lastSeen !== '') {
        $seconds = max(0, time() - strtotime($lastSeen));
    }

    $isOnline = $seconds <= 75 && ($row['app_state'] ?? '') !== 'offline';

    if ($isOnline) {
        $lastSeenText = 'همین الان آنلاین است';
    } elseif ($seconds < 3600) {
        $lastSeenText = max(1, (int)floor($seconds / 60)) . ' دقیقه پیش';
    } elseif ($seconds < 86400) {
        $lastSeenText = max(1, (int)floor($seconds / 3600)) . ' ساعت پیش';
    } else {
        $lastSeenText = max(1, (int)floor($seconds / 86400)) . ' روز پیش';
    }

    return [
        'user_id' => (int)$userId,
        'is_online' => $isOnline,
        'status_text' => $isOnline ? 'آنلاین' : 'آفلاین',
        'last_seen_text' => $lastSeenText,
        'last_seen_at' => $lastSeen
    ];
}

function top_freelancers_from_db(PDO $pdo, $excludeUserId = 0) {
    if (!table_exists($pdo, 'users') || !table_exists($pdo, 'user_profiles')) {
        return [];
    }

    $hasResume = table_exists($pdo, 'user_resumes');
    $hasPortfolio = table_exists($pdo, 'portfolio_items');
    $hasWork = table_exists($pdo, 'user_work_experiences');

    $resumeJoin = $hasResume ? "LEFT JOIN user_resumes r ON r.user_id = u.id" : "";
    $titleSelect = $hasResume ? "r.professional_title AS professional_title" : "'' AS professional_title";
    $portfolioSelect = $hasPortfolio ? "(SELECT COUNT(*) FROM portfolio_items pi WHERE pi.user_id = u.id) AS portfolio_count" : "0 AS portfolio_count";
    $workSelect = $hasWork ? "(SELECT COUNT(*) FROM user_work_experiences we WHERE we.user_id = u.id) AS work_count" : "0 AS work_count";

    $sql = "
        SELECT
            u.id,
            p.full_name,
            p.company_registered_name,
            p.profile_image_path,
            {$titleSelect},
            {$portfolioSelect},
            {$workSelect}
        FROM users u
        LEFT JOIN user_profiles p ON p.user_id = u.id
        {$resumeJoin}
        WHERE u.user_type = 'freelancer'
    ";

    $params = [];
    if ((int)$excludeUserId > 0) {
        $sql .= " AND u.id <> ?";
        $params[] = (int)$excludeUserId;
    }

    $sql .= " ORDER BY p.profile_image_path IS NULL, u.id DESC LIMIT 12";
    $rows = fetch_all($pdo, $sql, $params);

    $result = [];
    foreach ($rows as $row) {
        $name = trim((string)($row['full_name'] ?? ''));
        if ($name === '') {
            $name = trim((string)($row['company_registered_name'] ?? ''));
        }
        if ($name === '') {
            $name = 'فریلنسر DoorKar';
        }

        $title = trim((string)($row['professional_title'] ?? ''));
        if ($title === '') {
            $title = 'فریلنسر آماده همکاری';
        }

        $portfolioCount = (int)($row['portfolio_count'] ?? 0);
        $workCount = (int)($row['work_count'] ?? 0);

        $freelancerId = (int)($row['id'] ?? 0);

        $result[] = [
            'id' => $freelancerId,
            'name' => $name,
            'title' => $title,
            'meta' => 'نمونه‌کار: ' . $portfolioCount . ' • سابقه: ' . $workCount,
            'profile_image_url' => public_url($row['profile_image_path'] ?? ''),
            'presence' => presence_summary($pdo, $freelancerId)
        ];
    }

    return $result;
}

function verify_session(PDO $pdo, $userId, $apiToken) {
    if ($userId <= 0 || trim($apiToken) === '') {
        return false;
    }

    $user = fetch_one(
        $pdo,
        "SELECT id, api_token_hash FROM users WHERE id = ? LIMIT 1",
        [$userId]
    );

    if (!$user) return false;

    $storedHash = trim((string)($user['api_token_hash'] ?? ''));
    if ($storedHash === '') {
        return false;
    }

    // حالت فعلی دیتابیس شما: api_token_hash از نوع SHA-256 و ۶۴ کاراکتر است.
    if (preg_match('/^[a-f0-9]{64}$/i', $storedHash)) {
        return hash_equals(
            strtolower($storedHash),
            hash('sha256', $apiToken)
        );
    }

    // پشتیبانی از حالتی که بعداً توکن با password_hash ذخیره شود.
    if (str_starts_with($storedHash, '$2y$') || str_starts_with($storedHash, '$argon2')) {
        return password_verify($apiToken, $storedHash);
    }

    return false;
}

function profile_basic_completed($profile) {
    if (!$profile) return false;

    if ((int)($profile['profile_completed'] ?? 0) === 1) {
        return true;
    }

    $hasName = trim((string)($profile['full_name'] ?? '')) !== '' ||
        trim((string)($profile['company_registered_name'] ?? '')) !== '' ||
        trim((string)($profile['company_name'] ?? '')) !== '';

    $hasContactOrLocation = trim((string)($profile['email'] ?? '')) !== '' ||
        trim((string)($profile['contact_phone'] ?? '')) !== '' ||
        trim((string)($profile['national_code'] ?? '')) !== '' ||
        (int)($profile['province_id'] ?? 0) > 0 ||
        (int)($profile['city_id'] ?? 0) > 0;

    return $hasName && $hasContactOrLocation;
}

function completion_summary($profile, $portfolioCount, $workCount, $educationCount) {
    $items = [
        [
            'key' => 'basic_info',
            'title' => 'مشخصات اولیه',
            'completed' => profile_basic_completed($profile),
            'weight' => 20
        ],
        [
            'key' => 'profile_image',
            'title' => 'تصویر پروفایل',
            'completed' => $profile && trim((string)($profile['profile_image_path'] ?? '')) !== '',
            'weight' => 20
        ],
        [
            'key' => 'portfolio',
            'title' => 'ثبت نمونه‌کار',
            'completed' => $portfolioCount > 0,
            'weight' => 20
        ],
        [
            'key' => 'education',
            'title' => 'سوابق تحصیلی',
            'completed' => $educationCount > 0,
            'weight' => 20
        ],
        [
            'key' => 'work',
            'title' => 'سوابق کاری',
            'completed' => $workCount > 0,
            'weight' => 20
        ]
    ];

    $percent = 0;
    foreach ($items as $item) {
        if ($item['completed']) {
            $percent += (int)$item['weight'];
        }
    }

    return [
        'percent' => max(0, min(100, $percent)),
        'completed' => $percent >= 100,
        'items' => array_map(function ($item) {
            return [
                'key' => $item['key'],
                'title' => $item['title'],
                'completed' => (bool)$item['completed'],
                'weight' => (int)$item['weight']
            ];
        }, $items)
    ];
}

function toman_text($amount) {
    $amount = (int)$amount;
    if ($amount <= 0) return '۰ تومان';
    return number_format($amount) . ' تومان';
}

try {
    $pdo = new PDO(
        "mysql:host={$DB_HOST};dbname={$DB_NAME};charset=utf8mb4",
        $DB_USER,
        $DB_PASS,
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]
    );
} catch (Throwable $e) {
    respond(false, [], 'اتصال به دیتابیس برقرار نشد');
}

$input = input_json();
$action = trim((string)($input['action'] ?? ''));

if ($action !== 'get_home_dashboard') {
    respond(false, [], 'درخواست نامعتبر است');
}

$userId = (int)($input['user_id'] ?? 0);
$apiToken = trim((string)($input['api_token'] ?? ''));

if (!verify_session($pdo, $userId, $apiToken)) {
    respond(false, [], 'نشست ورود معتبر نیست؛ دوباره وارد حساب شو');
}

upsert_presence($pdo, $userId);

$user = fetch_one(
    $pdo,
    "SELECT id, mobile_number, user_type FROM users WHERE id = ? LIMIT 1",
    [$userId]
) ?: [];

$profile = table_exists($pdo, 'user_profiles')
    ? fetch_one($pdo, "SELECT * FROM user_profiles WHERE user_id = ? LIMIT 1", [$userId])
    : null;

$resume = table_exists($pdo, 'user_resumes')
    ? fetch_one($pdo, "SELECT * FROM user_resumes WHERE user_id = ? LIMIT 1", [$userId])
    : null;

$userType = trim((string)($user['user_type'] ?? 'freelancer'));
if ($userType === '') $userType = 'freelancer';

$displayName = trim((string)($profile['full_name'] ?? ''));
if ($displayName === '') {
    $displayName = trim((string)($profile['company_registered_name'] ?? ''));
}
if ($displayName === '') {
    $displayName = 'کاربر DoorKar';
}

$reviewStatus = trim((string)($profile['review_status'] ?? 'draft'));
$profileImageUrl = public_url($profile['profile_image_path'] ?? '');
$professionalTitle = trim((string)($resume['professional_title'] ?? ''));
$resumeText = trim((string)($resume['resume_text'] ?? ''));

$portfolioCount = count_for_user($pdo, 'portfolio_items', $userId);
$workCount = count_for_user($pdo, 'user_work_experiences', $userId);
$educationCount = count_for_user($pdo, 'user_educations', $userId);
$unreadMessages = unread_count($pdo, 'messages', $userId);
$unreadNotifications = unread_count($pdo, 'notifications', $userId);
$walletBalance = wallet_balance($pdo, $userId);
$completion = completion_summary($profile, $portfolioCount, $workCount, $educationCount);
$completionPercent = (int)($completion['percent'] ?? 0);

$isEmployer = in_array(strtolower($userType), ['employer', 'client', 'karfarma'], true) || strpos($userType, 'کارفرما') !== false;

if ($isEmployer) {
    $stats = [
        'stat_one_value' => '۰',
        'stat_one_label' => 'پروژه ثبت‌شده',
        'stat_two_value' => '۰',
        'stat_two_label' => 'پیشنهاد جدید',
        'stat_three_value' => '۰',
        'stat_three_label' => 'پروژه فعال'
    ];
} else {
    $stats = [
        'stat_one_value' => (string)$workCount,
        'stat_one_label' => 'سابقه کاری',
        'stat_two_value' => (string)$educationCount,
        'stat_two_label' => 'تحصیلات',
        'stat_three_value' => (string)$portfolioCount,
        'stat_three_label' => 'نمونه‌کار'
    ];
}

$recommendedProjects = [
    [
        'title' => 'طراحی اپلیکیشن فروشگاهی اندروید',
        'summary' => 'یک اپ فروشگاهی با پنل مدیریت، درگاه پرداخت و اتصال API نیاز است.',
        'budget' => '۸ تا ۱۲ میلیون',
        'deadline' => '۳۰ روز',
        'proposals' => '۱۲ پیشنهاد',
        'badge' => 'بودجه بالا',
        'skills' => ['Android', 'Kotlin', 'API']
    ],
    [
        'title' => 'طراحی سایت شرکتی با پنل مدیریت',
        'summary' => 'طراحی سایت ریسپانسیو، صفحه خدمات، فرم تماس و مدیریت محتوا.',
        'budget' => 'توافقی',
        'deadline' => '۲۰ روز',
        'proposals' => '۷ پیشنهاد',
        'badge' => 'جدید',
        'skills' => ['WordPress', 'UI', 'SEO']
    ]
];

$latestProjects = [
    [
        'title' => 'تولید محتوای اینستاگرام برای برند آموزشی',
        'summary' => 'طراحی تقویم محتوا، کپشن‌نویسی و آماده‌سازی ایده پست و استوری.',
        'budget' => '۳ تا ۵ میلیون',
        'deadline' => '۱۵ روز',
        'proposals' => '۵ پیشنهاد',
        'badge' => 'فوری',
        'skills' => ['محتوا', 'اینستاگرام', 'کپی‌رایتینگ']
    ],
    [
        'title' => 'طراحی رابط کاربری اپلیکیشن خدماتی',
        'summary' => 'طراحی UI مدرن برای اپ خدماتی شامل صفحه اصلی، جزئیات و پرداخت.',
        'budget' => '۶ تا ۱۰ میلیون',
        'deadline' => '۱۸ روز',
        'proposals' => '۹ پیشنهاد',
        'badge' => 'ویژه',
        'skills' => ['UI/UX', 'Figma', 'Mobile']
    ]
];

$categories = [
    ['title' => 'برنامه‌نویسی'],
    ['title' => 'طراحی سایت'],
    ['title' => 'طراحی اپلیکیشن'],
    ['title' => 'تولید محتوا'],
    ['title' => 'گرافیک'],
    ['title' => 'سئو'],
    ['title' => 'ترجمه'],
    ['title' => 'تدوین ویدیو'],
    ['title' => 'حسابداری'],
    ['title' => 'شبکه اجتماعی'],
    ['title' => 'مشاوره'],
    ['title' => 'پشتیبانی']
];

$urgentProjects = [
    [
        'title' => 'پروژه فوری طراحی صفحه اصلی اپلیکیشن',
        'summary' => 'طراحی سریع و حرفه‌ای صفحه اصلی اپ خدماتی با رعایت UI/UX و خروجی آماده توسعه.',
        'budget' => '۵ تا ۸ میلیون',
        'deadline' => '۷ روز',
        'proposals' => '۳ پیشنهاد',
        'badge' => 'فوری',
        'is_urgent' => true,
        'skills' => ['UI/UX', 'Mobile', 'Figma']
    ],
    [
        'title' => 'رفع فوری خطای اپ اندروید و اتصال API',
        'summary' => 'بررسی خطاهای Build، اصلاح اتصال API و آماده‌سازی نسخه قابل تست.',
        'budget' => 'توافقی',
        'deadline' => '۳ روز',
        'proposals' => '۶ پیشنهاد',
        'badge' => 'فوری',
        'is_urgent' => true,
        'skills' => ['Android', 'Kotlin', 'API']
    ]
];

$topFreelancers = top_freelancers_from_db($pdo, $isEmployer ? 0 : $userId);

if (count($topFreelancers) === 0) {
    $topFreelancers = [
        [
            'name' => 'فریلنسر آماده همکاری',
            'title' => 'متخصص پروژه‌های آنلاین',
            'meta' => 'آماده دریافت پروژه',
            'profile_image_url' => ''
        ],
        [
            'name' => 'طراح رابط کاربری',
            'title' => 'UI/UX Designer',
            'meta' => 'نمونه‌کار فعال',
            'profile_image_url' => ''
        ],
        [
            'name' => 'برنامه‌نویس اندروید',
            'title' => 'Kotlin Developer',
            'meta' => 'پروژه موبایل',
            'profile_image_url' => ''
        ],
        [
            'name' => 'تولیدکننده محتوا',
            'title' => 'Content Specialist',
            'meta' => 'محتوای شبکه اجتماعی',
            'profile_image_url' => ''
        ],
        [
            'name' => 'طراح سایت',
            'title' => 'WordPress / Web',
            'meta' => 'طراحی سایت',
            'profile_image_url' => ''
        ],
        [
            'name' => 'گرافیست',
            'title' => 'Graphic Designer',
            'meta' => 'بنر و لوگو',
            'profile_image_url' => ''
        ]
    ];
}

respond(true, [
    'user' => [
        'id' => $userId,
        'mobile_number' => (string)($user['mobile_number'] ?? ''),
        'user_type' => $userType,
        'display_name' => $displayName,
        'professional_title' => $professionalTitle,
        'review_status' => $reviewStatus,
        'profile_completed' => (int)($profile['profile_completed'] ?? 0) === 1,
        'resume_completed' => $resume !== null && ($professionalTitle !== '' || $resumeText !== ''),
        'profile_completion_percent' => $completionPercent,
        'profile_image_url' => $profileImageUrl,
        'presence' => presence_summary($pdo, $userId)
    ],
    'profile_completion' => $completion,
    'stats' => $stats,
    'messages_summary' => [
        'unread_count' => $unreadMessages
    ],
    'notifications_summary' => [
        'unread_count' => $unreadNotifications
    ],
    'wallet_summary' => [
        'balance' => $walletBalance,
        'balance_text' => toman_text($walletBalance)
    ],
    'recommended_projects' => $recommendedProjects,
    'urgent_projects' => $urgentProjects,
    'latest_projects' => $latestProjects,
    'categories' => $categories,
    'top_freelancers' => $topFreelancers
], 'اطلاعات صفحه اصلی دریافت شد');
