<?php
namespace App;

class Parser {
    public static function parseTelegramJsonToRecords(string $jsonPath): array {
        $data = Utils::jsonDecode($jsonPath);
        $msgs = $data['messages'] ?? [];
        $records = [];
        $pendingIndex = null;

        $count = count($msgs);
        for ($i=0; $i<$count; $i++) {
            $m = $msgs[$i];
            $text = self::plainText($m['text'] ?? '');
            if ($text === '') continue;

            $code   = Utils::extractProductCode($text);
            $isInfo = self::looksLikeInfoMessage($text);

            // پیامِ «فقط کد» (بدون اطلاعات مشتری) → کد مال رکورد قبلی است.
            // شرط !$isInfo حیاتی است: قبلاً اگر خودِ پیامِ مشتری کد داشت، همین‌جا
            // مصرف می‌شد و continue می‌خورد؛ یعنی آن مشتری هیچ‌وقت پارس نمی‌شد
            // (کامل ناپدید، حتی در گزارش حذف‌شده‌ها) و کدش هم اشتباهاً به مشتری
            // قبلی می‌چسبید.
            if ($code && !$isInfo) {
                if ($pendingIndex !== null && !isset($records[$pendingIndex]['product_code'])) {
                    $records[$pendingIndex]['product_code'] = $code;
                    $pendingIndex = null;
                }
                continue;
            }

            if ($isInfo) {
                $rec = [
                    'message_id' => $m['id'] ?? null,
                    'date'       => $m['date'] ?? null,
                    'text'       => $text,
                    'name'       => Utils::extractName($text),
                    'iban'       => Utils::extractIBAN($text),
                    'card'       => Utils::extractCard($text),
                    'amount_toman' => Utils::parseAmountToman($text),
                    'bank_name'    => Utils::extractBankName($text),
                    // احراز هویت: rejected/unsubmitted/unsent/waiting → از خروجی حذف و کدش گزارش می‌شود
                    'has_kyc'      => Utils::isKycBlocked($text),
                    'kyc_status'   => Utils::extractKycStatus($text),
                ];
                // اگر خودِ پیام مشتری کد داشت، آن کد مالِ همین رکورد است و دیگر
                // منتظر پیام کد بعدی نمی‌مانیم.
                if ($code) {
                    $rec['product_code'] = $code;
                    $records[] = $rec;
                    $pendingIndex = null;
                } else {
                    $records[] = $rec;
                    $pendingIndex = count($records) - 1;
                }
            }
        }
        return $records;
    }

    private static function looksLikeInfoMessage(string $t): bool {
        return (strpos($t, 'مبلغ') !== false) || (strpos($t, 'شماره کارت') !== false) || (strpos($t, 'شماره شبا') !== false) || (strpos($t, 'نام:') !== false);
    }

    public static function plainText($t): string {
        if (is_string($t)) return $t;
        if (is_array($t)) {
            $out = '';
            foreach ($t as $part) {
                if (is_string($part)) $out .= $part;
                elseif (is_array($part) && isset($part['text'])) $out .= $part['text'];
            }
            return $out;
        }
        return '';
    }
}