<?php
ini_set('display_errors', '0');
ini_set('log_errors', '1');
ini_set('error_log', __DIR__ . '/php_error.log');

define('BOT_TOKEN', '7266394475:AAEXZvhKhZkfw0jwAmU1mgf5Jt8YjuToVoY');
define('API_URL', 'https://api.telegram.org/bot' . BOT_TOKEN . '/');
define('ADMIN_GROUP_ID','-1003323294488'); // شناسه گروه تلگرام ادمین ها

$host = 'localhost';
$charset = 'utf8';
$db   = 'hoyairan_bot';
$charset = 'utf8mb4';
$DBuser = 'hoyairan_tlgbot';
$DBpassword = '2G=ca,1,ncn}!XNX';
$baseUrl  = "http://tebpars.eyebackteb.com:27961/";
$username = "admin";
$password = "987321654" ;

///////////////////
require_once 'webservice.php';

/* ================== TELEGRAM ================== */
function tgRequest($method, $data = []) {
    $ch = curl_init(API_URL . $method);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => json_encode($data, JSON_UNESCAPED_UNICODE),
        CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
        CURLOPT_TIMEOUT => 20,
    ]);
    $res = curl_exec($ch);
    curl_close($ch);
    return $res;
}

/* ================== DB ================== */
function db() {
    static $pdo;
    if ($pdo) return $pdo;
    global $host, $db, $charset, $DBuser, $DBpassword;
    $pdo = new PDO(
        "mysql:host=$host;dbname=$db;charset=$charset",
        $DBuser,
        $DBpassword,
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ]
    );
    return $pdo;
}

/* ================== SESSION HELPERS ================== */
function getSession($user_id) {
    $stmt = db()->prepare("SELECT * FROM hrp_bot_sessions WHERE user_id = :uid");
    $stmt->execute([':uid' => $user_id]);
    $row = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($row !== false) {
        return $row;
    }

    // رکورد وجود نداره → ایجاد رکورد خالی + برگرداندن پیش‌فرض
    $default = [
        'user_id'   => $user_id,
        'full_name' => null,
        'mobile'    => null,
        'step'      => null
    ];

    $stmt = db()->prepare("
        INSERT INTO hrp_bot_sessions (user_id, full_name, mobile, step)
        VALUES (:uid, NULL, NULL, NULL)
    ");
    $stmt->execute([':uid' => $user_id]);

    return $default;
}

function saveSession($user_id, $updates) {
    if (empty($updates)) {
        return; // هیچ تغییری نداره، بی‌خیال شو
    }

    $columns = array_keys($updates);
    $placeholders = array_map(fn($col) => ":$col", $columns);
    $setClause = implode(', ', array_map(fn($col) => "$col = :$col", $columns));

    $sql = "
        INSERT INTO hrp_bot_sessions (user_id, " . implode(', ', $columns) . ")
        VALUES (:uid, " . implode(', ', $placeholders) . ")
        ON DUPLICATE KEY UPDATE $setClause
    ";

    $stmt = db()->prepare($sql);

    // بایند کردن user_id
    $stmt->bindValue(':uid', $user_id, PDO::PARAM_INT);

    // بایند کردن مقادیر به‌روزرسانی
    foreach ($updates as $key => $value) {
        $stmt->bindValue(":$key", $value);
    }

    $stmt->execute();
}

/* ================== MAIN MENU ================== */
function sendMainMenu($chatId) {
    tgRequest('sendMessage', [
        'chat_id' => $chatId,
        'text'    => "👋 لطفاً یکی از گزینه‌های زیر را انتخاب کنید:",
        'reply_markup' => [
            'inline_keyboard' => [
                [['text' => '🛒 ثبت سفارش',     'callback_data' => 'MAIN_ORDER']],
                [['text' => '📘 دانلود کاتالوگ', 'callback_data' => 'MAIN_CATALOG']],
            ]
        ]
    ]);
}

/* ================== LOG REQUESTS ================== */
function checkAndLogRequest($user_id, $type, $product_name = null, $username = null, $limit = 12) {
    $pdo = db();
    $today = date('Y-m-d');

    $stmt = $pdo->prepare("SELECT COUNT(*) as cnt FROM user_requests_log 
                           WHERE user_id=:uid AND DATE(created_at)=:today");
    $stmt->execute([':uid'=>$user_id, ':today'=>$today]);
    $count = $stmt->fetch()['cnt'] ?? 0;

    if ($count >= $limit) {
        return ['ok' => false, 'msg' => "⚠️ شما امروز بیش از {$limit} درخواست ارسال کرده‌اید.\nلطفاً فردا مراجعه کنید."];
    }

    $stmt = $pdo->prepare("INSERT INTO user_requests_log
        (user_id, username, request_type, product_name)
        VALUES (:uid, :uname, :type, :prod)");
    $stmt->execute([
        ':uid'  => $user_id,
        ':uname'=> $username,
        ':type' => $type,
        ':prod' => $product_name
    ]);

    return ['ok' => true];
}

/* ================== HELPERS ================== */
function cleanBtnText($s, $max = 50) {
    $s = trim(preg_replace('/\s+/', ' ', $s));
    return (mb_strlen($s) > $max) ? mb_substr($s, 0, $max - 1) . '…' : ($s ?: '(بدون عنوان)');
}

/* ================== DATA & UI functions ================== */
// مرحله 1
function getStage1Options(){
    return array_column(
        db()->query("
            SELECT DISTINCT PropertiesComment
            FROM hrp_products
            WHERE PropertiesComment IS NOT NULL AND TRIM(PropertiesComment) <> ''
            ORDER BY PropertiesComment
        ")->fetchAll(),
        'PropertiesComment'
    );
}

// مرحله 2
function getStage2Options($s1){
    $stmt = db()->prepare("
        SELECT DISTINCT AdditionalField2
        FROM hrp_products
        WHERE PropertiesComment = :s1
          AND AdditionalField2 IS NOT NULL AND TRIM(AdditionalField2) <> ''
        ORDER BY AdditionalField2
    ");
    $stmt->execute([':s1'=>$s1]);
    return array_column($stmt->fetchAll(),'AdditionalField2');
}

// مرحله 3
function getStage3Options($s1,$s2=null){
    $sql = "
        SELECT DISTINCT AdditionalField1
        FROM hrp_products
        WHERE PropertiesComment = :s1
    ";
    $params = [':s1'=>$s1];

    if($s2 !== null){
        $sql .= " AND AdditionalField2 = :s2";
        $params[':s2'] = $s2;
    }

    $sql .= " AND AdditionalField1 IS NOT NULL AND TRIM(AdditionalField1) <> ''
              ORDER BY AdditionalField1";

    $stmt = db()->prepare($sql);
    $stmt->execute($params);
    return array_column($stmt->fetchAll(),'AdditionalField1');
}

// محصول نهایی
function getProductBySelection($s1,$s2,$s3){
    $sql = "
        SELECT *
        FROM hrp_products
        WHERE PropertiesComment = :s1
          AND AdditionalField1 = :s3
    ";
    $params = [':s1'=>$s1, ':s3'=>$s3];

    if($s2 !== null){
        $sql .= " AND AdditionalField2 = :s2";
        $params[':s2'] = $s2;
    }

    $stmt = db()->prepare($sql);
    $stmt->execute($params);
    return $stmt->fetch();
}


/* ================== UI ================== */
function sendStage($chatId,$msgId,$items,$stage,$page=0,$perPage=15,$extra=[]){
    $total = count($items);
    $slice = array_slice($items,$page*$perPage,$perPage);

    $buttons = [];

    foreach($slice as $i=>$item){
        $realIndex = $page*$perPage + $i;
        $cb = "$stage:ITEM:$realIndex";
        if($extra){
            $cb .= ':' . implode('|',array_map('urlencode',$extra));
        }
        $buttons[] = [[
            'text'=>"✅ ".cleanBtnText($item),
            'callback_data'=>$cb
        ]];
    }

    $nav = [];
    if($page>0){
        $nav[] = [
            'text'=>'⬅️ قبلی',
            'callback_data'=>"$stage:PAGE:".($page-1).($extra?':'.implode('|',array_map('urlencode',$extra)):'')
        ];
    }
    if(($page+1)*$perPage < $total){
        $nav[] = [
            'text'=>'بعدی ➡️',
            'callback_data'=>"$stage:PAGE:".($page+1).($extra?':'.implode('|',array_map('urlencode',$extra)):'')
        ];
    }
    if($nav) $buttons[] = $nav;

    $buttons[] = [[
        'text'=>'🏠 بازگشت به منوی اصلی',
        'callback_data'=>'HOME'
    ]];

    tgRequest('editMessageText',[
        'chat_id'=>$chatId,
        'message_id'=>$msgId,
        'text'=>"📌 لطفاً گزینه مورد نظر را انتخاب کنید:",
        'reply_markup'=>['inline_keyboard'=>$buttons]
    ]);
}

/* ================== مشخصات + موجودی ================== */
function sendOrderConfirmation($chatId,$msgId,$p,$user){
    $text = "🧾 مشخصات محصول:\n\n";
    $text .= "🔹 {$p['PropertiesComment']}\n";
    if($p['AdditionalField2']) $text .= "🔹 {$p['AdditionalField2']}\n";
    $text .= "🔹 {$p['AdditionalField1']}\n\n";
    $text .= "📦 {$p['Name']}\n";

    tgRequest('editMessageText',[
        'chat_id'=>$chatId,
        'message_id'=>$msgId,
        'text'=>$text,
        'reply_markup'=>[
            'inline_keyboard'=>[
                [[ 'text'=>'🛒 ثبت سفارش','callback_data'=>"ORDER:{$p['id']}" ]],
                [[ 'text'=>'🏠 بازگشت به منوی اصلی','callback_data'=>'HOME' ]]
            ]
        ]
    ]);
}


/* ================== WEBHOOK ================== */
$update = json_decode(file_get_contents('php://input'), true);
if (!$update) exit;

$chatId = null;
$userId = null;
$text   = trim($update['message']['text'] ?? '');

/* ================== MESSAGE HANDLER ================== */
if (isset($update['message'])) {
    $chatId = $update['message']['chat']['id'];
    $userId = $update['message']['from']['id'];
    $session = getSession($userId);


    // /start
    if ($text === '/start') {
        $session = getSession($userId);
    
        if (empty($session['full_name']) || empty($session['mobile'])) {
            saveSession($userId, ['step' => 'get_name']);
            tgRequest('sendMessage', [
                'chat_id' => $chatId,
                 'text'    => " 🟢کاربر گرامی، جهت استفاده از بات لطفا ابتدا ثبت نام نمایید.\n\n
  لطفا نام و نام خانوادگی خود را وارد کنید: "
            ]);
        } else {
            sendMainMenu($chatId);
        }
        exit;
    }

    // دریافت نام
    if ($session['step'] === 'get_name') {
        if (mb_strlen($text) < 4) {
            tgRequest('sendMessage', [
                'chat_id' => $chatId,
                'text'    => "نام خیلی کوتاه است. لطفاً نام و نام خانوادگی کامل وارد کنید:"
            ]);
            exit;
        }

        saveSession($userId, ['full_name' => $text, 'step' => 'get_mobile']);
        tgRequest('sendMessage', [
            'chat_id' => $chatId,
             'text'    => "📱اکنون لطفا شماره موبایل خود رو وارد نمایید (از اعداد انگلیسی استفاده نمایید):"
        ]);
        exit;
    }

    // دریافت موبایل
    if ($session['step'] === 'get_mobile') {
        if (!preg_match('/^09[0-9]{9}$|^9[0-9]{9}$|^0[0-9]{9,10}$/', $text)) {
            tgRequest('sendMessage', [
                'chat_id' => $chatId,
                'text'    => "شماره موبایل نامعتبر است.\nلطفاً شماره را با فرمت درست وارد کنید (مثال: 09123456789):"
            ]);
            exit;
        }

        saveSession($userId, ['mobile' => $text, 'step' => null]);
        tgRequest('sendMessage', [
            'chat_id' => $chatId,
             'text'    => "✅  اطلاعات شما ثبت شد.\nبات آماده خدمت رسانی میباشد "
        ]);

        sendMainMenu($chatId);
        exit;
    }

    // اگر متن معمولی بود و step نداشت → منو نشان بده (اختیاری)
    sendMainMenu($chatId);
    exit;
}

/* ================== CALLBACK QUERY ================== */
$q = $update['callback_query'] ?? null;
if (!$q) exit;

tgRequest('answerCallbackQuery', ['callback_query_id' => $q['id']]);

$data    = $q['data'];
$chatId  = $q['message']['chat']['id'];
$msgId   = $q['message']['message_id'];
$user    = $q['from'];
$userId  = $user['id'];

$session = getSession($userId);

/* ===== MAIN MENU ===== */
if ($data === 'MAIN_ORDER') {
    $session = getSession($userId);  // ← دوباره بخوان (خیلی مهم)

    if (empty($session['full_name']) || empty($session['mobile'])) {
        saveSession($userId, ['step' => 'get_name']);
        tgRequest('editMessageText', [
            'chat_id'    => $chatId,
            'message_id' => $msgId,
            'text'    => " 🟢کاربر گرامی، جهت استفاده از بات لطفا ابتدا ثبت نام نمایید.\n\n
  لطفا نام و نام خانوادگی خود را وارد کنید: "
        ]);
    } else {
        $items = getStage1Options();
        if (empty($items)) {
            tgRequest('editMessageText', [
                'chat_id'    => $chatId,
                'message_id' => $msgId,
                'text'       => "در حال حاضر هیچ گزینه‌ای برای انتخاب وجود ندارد.",
            ]);
        } else {
            sendStage($chatId, $msgId, $items, 'S1', 0, 15);
        }
    }
    exit;
}

elseif ($data === 'MAIN_CATALOG') {
    // کد قبلی شما بدون تغییر
    tgRequest('editMessageText', [
        'chat_id'    => $chatId,
        'message_id' => $msgId,
        'text'       => "📘 لطفاً کاتالوگ مورد نظر را انتخاب کنید:",
        'reply_markup' => [
            'inline_keyboard' => [
                [['text'=>'Vivinex Impress',       'callback_data'=>'CATALOG:impress']],
                [['text'=>'Vivinex Gemetric',      'callback_data'=>'CATALOG:gemetric']],
                [['text'=>'Vivinex Gemetric Plus', 'callback_data'=>'CATALOG:gemetric_plus']],
                [['text'=>'VIVINEX TORIC',         'callback_data'=>'CATALOG:toric']],
                [['text'=>'🏠 بازگشت به منوی اصلی', 'callback_data'=>'HOME']]
            ]
        ]
    ]);
    exit;
}

elseif ($data === 'HOME') {
    sendMainMenu($chatId);
    exit;
}





/* ===== DOWNLOAD PDF & LOG ===== */
elseif(preg_match('/^CATALOG:(.+)$/',$data,$m)){

    $type = $m[1];

    $baseUrl = "https://tlgbot.hoyairan.com/catalogs/";

    $files = [
        'impress'       => $baseUrl.'2023-08-15_HSOE_XY1-EM_DS_EN.pdf',
        'gemetric'      => $baseUrl.'2023-08-11_HSOE_XY1-G_XY1-GP_XY1-GT_XY1-GPT_DS_EN.pdf',
        'gemetric_plus' => $baseUrl.'2023-08-11_HSOE_XY1-G_XY1-GP_XY1-GT_XY1-GPT_DS_EN.pdf',
        'toric'         => $baseUrl.'2023-08-11_HSOE_XY1A-SP_BR_EN.pdf',
    ];

    if(!isset($files[$type])) return;

    tgRequest('sendDocument',[
        'chat_id'=>$chatId,
        'document'=>$files[$type],
        'caption'=>"📘 کاتالوگ محصول"
    ]);
}


/* ===== ثبت سفارش و مراحل انتخاب محصول ===== */
elseif(preg_match('/^S1:ITEM:(\d+)/',$data,$m)){
    $s1 = getStage1Options()[$m[1]] ?? null;
    if(!$s1) return;
    $s2 = getStage2Options($s1);
    if($s2){
        sendStage($chatId,$msgId,$s2,'S2',0,15,[$s1]);
    }else{
        $s3 = getStage3Options($s1);
        sendStage($chatId,$msgId,$s3,'S3',0,15,[$s1]);
    }
}
elseif(preg_match('/^S2:ITEM:(\d+):(.+)/',$data,$m)){
    $extra = explode('|',urldecode($m[2]));
    $s1 = $extra[0];
    $s2 = getStage2Options($s1)[$m[1]] ?? null;
    if(!$s2) return;
    $s3 = getStage3Options($s1,$s2);
    sendStage($chatId,$msgId,$s3,'S3',0,15,[$s1,$s2]);
}
elseif(preg_match('/^S3:ITEM:(\d+):(.+)/',$data,$m)){
    $extra = explode('|',urldecode($m[2]));
    $s1 = $extra[0];
    $s2 = $extra[1] ?? null;
    $s3 = getStage3Options($s1,$s2)[$m[1]] ?? null;
    if(!$s3) return;
    $p = getProductBySelection($s1,$s2,$s3);
    if(!$p) return;

    // محدودیت روزانه
    $logCheck = checkAndLogRequest($user['id'], 'ORDER', $p['Name'], $user['username'] ?? null);
    if(!$logCheck['ok']){
        tgRequest('editMessageText',[
            'chat_id'=>$chatId,
            'message_id'=>$msgId,
            'text'=>$logCheck['msg']
        ]);
        return;
    }

    sendOrderConfirmation($chatId,$msgId,$p,$user);
}
elseif(preg_match('/^(S2|S3):PAGE:(\d+):(.+)/',$data,$m)){
    $stage = $m[1];
    $page  = (int)$m[2];
    $extra = explode('|',urldecode($m[3]));
    $s1 = $extra[0];
    $s2 = $extra[1] ?? null;
    $items = ($stage==='S2') ? getStage2Options($s1) : getStage3Options($s1,$s2);
    sendStage($chatId,$msgId,$items,$stage,$page,15,array_filter([$s1,$s2]));
}
elseif(preg_match('/^ORDER:(\d+)/',$data,$m)){
    $stmt=db()->prepare("SELECT * FROM hrp_products WHERE ID=:id");
    $stmt->execute([':id'=>$m[1]]);
    if(!$p=$stmt->fetch()) return;

    $uname = $user['username'] ? '@'.$user['username'] : ($user['first_name'] ?? 'کاربر');
    $path = "{$p['PropertiesComment']} > {$p['AdditionalField2']} > {$p['AdditionalField1']} > {$p['Name']}";

    tgRequest('sendMessage',[
        'chat_id'=>ADMIN_GROUP_ID,
        'text'=>"🛒 سفارش جدید\n\n👤 $uname\n\n🧭 $path"
    ]);

    tgRequest('editMessageText',[
        'chat_id'=>$chatId,
        'message_id'=>$msgId,
        'text'=>"✅ سفارش شما ثبت شد و به ادمین ارسال شد.\n\n🧭 $path",
        'reply_markup'=>[
            'inline_keyboard'=>[[['text'=>'🏠 بازگشت به منوی اصلی','callback_data'=>'HOME']]]
        ]
    ]);

    logOrder($uname,$p,null);
}

exit;
