<?php
declare(strict_types=1);

require_once __DIR__ . '/legacy_core.php';

function legacyLoadBotConfig(string $configFile): array
{
    if (!is_file($configFile)) {
        throw new RuntimeException('فایل تنظیمات legacy پیدا نشد: ' . $configFile);
    }

    $config = require $configFile;
    if (!is_array($config)) {
        throw new RuntimeException('فایل تنظیمات legacy معتبر نیست.');
    }

    $config['runtime_dir'] = $config['runtime_dir'] ?? (dirname($configFile, 2) . '/storage/runtime');
    $config['output_dir']  = $config['output_dir'] ?? (dirname($configFile, 2) . '/storage/exports');

    ensureDir($config['runtime_dir']);
    ensureDir($config['output_dir']);

    return $config;
}

function webRunUnmappedProductsExport(array $config): array
{
    $file = runUnmappedProductsExporter($config);
    return [
        'file' => $file,
        'message' => 'فایل کالاهای مپ نشده ساخته شد.',
    ];
}

function webRunAllExports(array $config): array
{
    $files = [];
    $warnings = [];

    $steps = [
        'hesabanweb' => ['label' => 'حسابران‌وب', 'runner' => fn() => runHesabanwebExporter($config)],
        'ahvazphone' => ['label' => 'اهوازفون', 'runner' => fn() => runAhvazPhoneExporter($config)],
        'farnaa' => ['label' => 'فرنا', 'runner' => fn() => runFarnaaExporter($config)],
        'hamrahtel' => ['label' => 'همراه‌تل', 'runner' => fn() => runHamrahtelExporter($config)],
        'digikala' => ['label' => 'دیجی‌کالا', 'runner' => fn() => runDigikalaExporter($config)],
        'mobile140' => ['label' => 'موبایل 140', 'runner' => fn() => runMobile140Exporter($config)],
        'technolife' => ['label' => 'تکنولایف', 'runner' => fn() => runTechnolifeExporter($config)],
    ];

    foreach ($steps as $key => $step) {
        try {
            $path = $step['runner']();
            $files[] = [
                'key' => $key,
                'label' => $step['label'],
                'path' => $path,
                'basename' => basename($path),
            ];
        } catch (Throwable $e) {
            $warnings[] = $step['label'] . ': ' . $e->getMessage();
            logLine($config, 'WEB EXPORT ERROR | ' . $step['label'] . ' | ' . $e->getMessage());
        }
    }

    return [
        'files' => $files,
        'warnings' => $warnings,
        'message' => 'استخراج همه فایل‌ها انجام شد.',
    ];
}

function webGenerateSmartMapTemplate(array $config): array
{
    $file = getSmartMapTemplateFileForSend($config);
    return [
        'file' => $file,
        'message' => 'فایل مپ قیمت هوشمند ساخته شد.',
    ];
}

function webSaveUploadedSmartMap(array $config, string $uploadedFilePath): array
{
    $rows = readSmartMapFile($uploadedFilePath);
    if (!$rows) {
        throw new RuntimeException('هیچ ردیف معتبری در فایل مپ پیدا نشد.');
    }

    saveSmartPriceMap($config, $rows);

    return [
        'rows_count' => count($rows),
        'message' => 'مپ قیمت هوشمند ذخیره شد.',
    ];
}

function webGenerateSmartReview(array $config, string $actorKey = 'admin'): array
{
    $map = loadSmartPriceMap($config);
    if (!$map) {
        throw new RuntimeException('اول باید مپ قیمت هوشمند را تنظیم کنی.');
    }

    $reviewRows = buildSmartPricingReviewRows($config, $map);
    if (!$reviewRows) {
        throw new RuntimeException('هیچ ردیفی برای بررسی قیمت هوشمند ساخته نشد.');
    }

    saveLatestSmartReviewRows($config, $reviewRows);
    $file = writeSmartPriceReviewCsv($config, $reviewRows);
    saveSmartReviewSnapshot($config, $actorKey, $reviewRows);

    return [
        'file' => $file,
        'rows_count' => count($reviewRows),
        'message' => 'فایل بررسی قیمت هوشمند ساخته شد.',
    ];
}

function webApplyUploadedSmartReview(array $config, string $uploadedFilePath, string $actorKey = 'admin'): array
{
    $rows = readSmartPriceReviewFile($uploadedFilePath);
    if (!$rows) {
        throw new RuntimeException('فایل بررسی معتبر نبود یا ردیفی نداشت.');
    }

    $approvedRows = normalizeApprovedSmartReviewRows($rows);
    $result = applySmartPricingRows($config, $approvedRows);

    saveFinalSmartAppliedRows($config, $rows);
    clearSmartReviewSnapshot($config, $actorKey);

    return [
        'result' => $result,
        'message' => buildSmartApplyResultMessage($result),
        'rows_count' => count($rows),
    ];
}

function webApplySavedSmartReviewSnapshot(array $config, string $actorKey = 'admin'): array
{
    $snapshot = loadSmartReviewSnapshot($config, $actorKey);
    if (!$snapshot) {
        throw new RuntimeException('اسنپ‌شات قیمت‌های پیشنهادی پیدا نشد.');
    }

    $approvedRows = [];
    $blockedRows = [];

    foreach ($snapshot as $row) {
        $status = trim((string)($row['status'] ?? ''));
        $proposedPrice = (int)($row['proposed_price'] ?? 0);
        $proposedStock = (int)($row['proposed_stock'] ?? 0);

        if ($status === 'قابل اعمال' && $proposedPrice > 0) {
            $approvedRows[] = [
                'product_id'           => (int)($row['product_id'] ?? 0),
                'title'                => (string)($row['title'] ?? ''),
                'variant'              => (string)($row['variant'] ?? '-'),
                'final_price_to_apply' => $proposedPrice,
                'final_stock_to_apply' => max(0, $proposedStock),
            ];
        } else {
            $blockedRows[] = $row;
        }
    }

    if (!$approvedRows) {
        $reasons = [];
        foreach ($blockedRows as $row) {
            $reasons[] =
                'شناسه ' . (string)($row['product_id'] ?? '') .
                ' | وضعیت: ' . (string)($row['status'] ?? 'نامشخص') .
                ' | قیمت خرید: ' . normalizePriceForSheet((string)($row['buy_price'] ?? 0)) .
                ' | قیمت پیشنهادی: ' . normalizePriceForSheet((string)($row['proposed_price'] ?? 0));
        }

        throw new RuntimeException("هیچ ردیف قابل اعمالی در اسنپ‌شات پیدا نشد.\n" . implode("\n", $reasons));
    }

    $result = applySmartPricingRows($config, $approvedRows);
    saveFinalSmartAppliedRows($config, $snapshot);
    clearSmartReviewSnapshot($config, $actorKey);

    return [
        'result' => $result,
        'message' => buildSmartApplyResultMessage($result),
        'rows_count' => count($snapshot),
    ];
}

function webBuildTextList(array $config): array
{
    $text = buildMobilePriceTextList($config);
    return [
        'text' => $text,
        'message' => 'لیست متنی ساخته شد.',
    ];
}
