<?php
// ====== CONFIG ======
const BOT_TOKEN      = '8383473808:AAHSsCzFxwf2okQY0XZ5FLZt_09xABHgbyQ';
const TELEGRAM_API   = 'https://api.telegram.org/bot' . BOT_TOKEN . '/';
const FILE_API       = 'https://api.telegram.org/file/bot' . BOT_TOKEN . '/';

// توکن سرویس استعلام زحل (بخش توسعه‌دهندگان پنل zohal.io)
// ⚠️ زحل فقط به درخواست‌هایی پاسخ می‌دهد که از IPهای اعلام‌شده در پنل بیایند؛
//    IP سرور باید آنجا ثبت شده باشد وگرنه همهٔ استعلام‌ها خطا می‌خورند.
const ZOHAL_TOKEN    = '2d0a10a4b295f9eb7eae64ca050a6236d92f02fa'; // Authorization: Bearer <token>
const ZOHAL_BASE_URL = 'https://service.zohal.io/api/v0';
const ADMIN_IDS      = [370237089]; // <-- put your Telegram user IDs here

// Optional webhook secret (set the same value in setWebhook &secret_token=...)
// Empty string = disabled. Telegram sends it in X-Telegram-Bot-Api-Secret-Token header.
const WEBHOOK_SECRET = 'Dgkshdgksjhd876Sshd';

// KYC (احراز هویت): وضعیت‌هایی که رکورد را از خروجی حذف می‌کنند (کدش در «کدهای حذف‌شده» گزارش می‌شود)
const KYC_BLOCKED_STATUSES = ['rejected', 'unsubmitted', 'unsent', 'waiting'];

// Pending inline-button states auto-expire after this many seconds (cleanup on each webhook hit)
const PENDING_TTL_SECONDS = 172800; // 48h

// ------------------------------------------------------------------
// Auto-post final report image to a Telegram channel (optional)
// ------------------------------------------------------------------
// Bot MUST be admin in the target channel.
// Examples:
//   const AUTO_POST_CHANNEL_ID = '@vgstore_reports';
//   const AUTO_POST_CHANNEL_ID = -1001234567890;
const AUTO_POST_CHANNEL_ENABLED = true;
const AUTO_POST_CHANNEL_ID      = '@accsell_varizi';

// Ask admin before posting the generated photo to the channel:
// «واریزی» / «برگشتی» / «هر دو»
// Caption will be built ONLY from product codes (with #), and will NOT include label/time/failed counts.
const AUTO_POST_CHANNEL_ASK_TYPE = true;

// Caption prefixes (used when posting to channel)
const AUTO_POST_PREFIX_VARIZI    = 'واریزی کد های:';
const AUTO_POST_PREFIX_BARGASHTI = 'برگشتی کد های:';
const AUTO_POST_PREFIX_BOTH      = 'واریزی یا برگشتی کد های:';

// Joiner for code list
const AUTO_POST_CODES_JOINER = ' ، ';

// Caption template supports placeholders:
// {label} {success_count} {failed_count} {dt}
const AUTO_POST_CHANNEL_CAPTION = "✅ گزارش نهایی {label}\nموفق: {success_count} | ناموفق: {failed_count}\n{dt}";

// If true, send the XLS to channel too (besides photo)
const AUTO_POST_CHANNEL_SEND_XLS = false;

// Photo rendering settings
const FINAL_PHOTO_ENABLED   = true;
const FINAL_PHOTO_MAX_ROWS  = 40;      // how many rows to include in the image (from data rows)
const FINAL_PHOTO_WIDTH     = 1700;    // chrome window width
const FINAL_PHOTO_HEIGHT    = 2200;    // chrome window height

// Watermark (drawn inside the generated image)
// mode: 'tile' (small repeated) or 'single' (one big diagonal)
const FINAL_PHOTO_WATERMARK_MODE    = 'tile';
const FINAL_PHOTO_WATERMARK_TEXT    = 'VG-STORE.IR';
// 0..1 (higher = darker watermark). Recommended for tile: 0.10..0.18
const FINAL_PHOTO_WATERMARK_OPACITY = 0.14;
const FINAL_PHOTO_WATERMARK_ANGLE   = -25;
// Optional overrides for tile mode (pixels). Set SIZE=0 to auto.
const FINAL_PHOTO_WATERMARK_SIZE    = 56;
const FINAL_PHOTO_WATERMARK_STEP_X  = 320;
const FINAL_PHOTO_WATERMARK_STEP_Y  = 220;
const FINAL_PHOTO_WATERMARK_INSET   = 0;

// Base data dir
const DATA_DIR       = __DIR__ . '/data';           // /data/<label> structure
const MAX_CODE_LOOKAHEAD = 3; // messages to look ahead for product code after info message

// Queue/worker
const QUEUE_DIR      = DATA_DIR . '/_queue';
const QUEUE_MAX_JOBS_PER_RUN = 20; // worker --once processes up to N jobs

// Caches
const CACHE_DIR      = DATA_DIR . '/_cache';
// کش کارت→شبا. شبای یک کارت مستقل از سرویس استعلام است، پس رکوردهای کش قدیمی
// زیبال معتبرند و بار اول به‌صورت خودکار به این فایل منتقل می‌شوند.
const ZIBAL_CACHE_FILE      = CACHE_DIR . '/zibal_card_to_iban.json'; // فقط برای انتقال یک‌بارهٔ کش قدیمی
const CARD_IBAN_CACHE_FILE  = CACHE_DIR . '/card_to_iban.json';
// طول عمر هر رکورد کش. کارت تعویضی/مسدود می‌تواند به شبای دیگری برسد، پس کش
// نباید دائمی باشد. رکوردهای بدون زمان (کش قدیمی) منقضی حساب می‌شوند.
const CARD_IBAN_CACHE_TTL_SECONDS = 7776000; // 90 روز

// همزمانی استعلام کارت→شبا. زدن همهٔ کارت‌ها (گاهی ۴۰+) یکجا باعث محدودیت نرخ
// و خطای شبکه می‌شود و کارت سالم «تبدیل‌نشده» گزارش می‌شود.
const ZOHAL_BATCH_CONCURRENCY = 8;
// خطاهای گذرا (شبکه، HTTP 429/5xx، result=5) چند بار دیگر تلاش می‌شوند.
// خطای خودِ زحل دربارهٔ کارت و نیز کمبود موجودی کیف پول تکرار نمی‌شوند.
const ZOHAL_RETRY_ATTEMPTS = 3;
const ZOHAL_RETRY_DELAY_MS = 500;

// Timezone for filenames/logs if needed
date_default_timezone_set('Asia/Tehran');


/** Bank statement mapping */
const BANK_START_ROW = 9;          // data starts from this (1-indexed)
const BANK_SRC_COL_START = 'B';    // take from B..O
const BANK_SRC_COL_END   = 'J';
const BASE_DST_COL_START = 'F';    // write into F..U
const BANK_AMOUNT_COL = 'F'; // <== set this to the column of amounts in bank statement (e.g., 'F')

/** TXT export options */
const TXT_USE_UTF8_BOM          = true;   // add BOM for better Windows/Bank import compatibility
const TXT_INCLUDE_PRODUCT_CODE  = false;  // keep TXT strictly 4 fields; set true to append code as 5th
const TXT_SEPARATOR             = ',';    // field separator
/** CSV export (Bank Samaneh) */
const CSV_USE_UTF8_BOM        = true;
const CSV_BANK_SAMANEH_HEADER = 'Destination Iban Number (Variz Be Sheba), Owner Name (Name e Sahebe Seporde), Transfer Amount (Mablagh), Destination Note (Sharh), Pay Id (Shenaseh variz) - Please do not remove this first row. (Lotfan radife nokhost ra paak nafarmayid.)';

/** CSV export (Bank Shahr) */
const CSV_BANK_SHAHR_HEADER = 'Destination Iban Number (Variz Be Sheba), Owner Name (Name e Sahebe Seporde), Transfer Amount (Mablagh), Description (Sharh), Factor Number (Shomare Factor) - Please do not remove this first row. (Lotfan radife nokhost ra paak nafarmayid.)';

/**
 * Output type definitions — add new types here in the future.
 * key        => unique identifier used in callback_data (max 10 chars)
 * label      => button text shown to admin
 * format     => 'txt' | 'csv_saman' | 'csv_shahr'  (controls file generation logic)
 */
const OUTPUT_TYPES = [
    'txt'       => ['label' => '📄 TXT — واریز دسته‌ای ملی', 'format' => 'txt'],
    'csv_saman' => ['label' => '📊 CSV — بانک سامان',         'format' => 'csv_saman'],
    'csv_shahr' => ['label' => '📊 CSV — بانک شهر',           'format' => 'csv_shahr'],
];


/** Finalization report (new .xls format) */
const FINAL_BANK_START_ROW = 7;   // data starts from row 7 (headers at 6)
const FINAL_IBAN_COL       = 'A';
const FINAL_AMOUNT_COL     = 'C';
const FINAL_STATUS_COL     = 'H';
const FINAL_DESC_COL       = 'I'; // write #CODE here
const FINAL_SUCCESS_WORD   = 'موفق';