<?php

declare(strict_types=1);

if (PHP_SAPI !== 'cli') {
    http_response_code(403);
    exit(1);
}

require_once __DIR__ . '/../src/config.php';
require_once __DIR__ . '/../src/storage.php';
require_once __DIR__ . '/../src/history.php';
require_once __DIR__ . '/../src/crm.php';

$cases = [
    'parts_from_retail' => [
        'deal' => ['CATEGORY_ID' => '0', 'STAGE_ID' => 'NEW'],
        'interest' => 'запчасти',
        'expected_update' => true,
        'expected_category' => '26',
        'expected_stage' => 'C26:NEW',
    ],
    'service_from_retail' => [
        'deal' => ['CATEGORY_ID' => '0', 'STAGE_ID' => 'NEW'],
        'interest' => 'сервис',
        'expected_update' => true,
        'expected_category' => '30',
        'expected_stage' => 'C30:NEW',
    ],
    'parts_already_in_category' => [
        'deal' => ['CATEGORY_ID' => '26', 'STAGE_ID' => 'C26:EXECUTING'],
        'interest' => 'запчасти',
        'expected_update' => false,
    ],
    'service_already_in_category' => [
        'deal' => ['CATEGORY_ID' => '30', 'STAGE_ID' => 'C30:EXECUTING'],
        'interest' => 'сервис',
        'expected_update' => false,
    ],
    'other_from_retail' => [
        'deal' => ['CATEGORY_ID' => '0', 'STAGE_ID' => 'NEW'],
        'interest' => 'другое',
        'expected_update' => true,
        'expected_category' => '0',
        'expected_stage' => '26',
    ],
    'other_from_another_category' => [
        'deal' => ['CATEGORY_ID' => '30', 'STAGE_ID' => 'C30:NEW'],
        'interest' => 'другое',
        'expected_update' => true,
        'expected_category' => '0',
        'expected_stage' => '26',
    ],
    'other_already_non_target' => [
        'deal' => ['CATEGORY_ID' => '0', 'STAGE_ID' => '26'],
        'interest' => 'другое',
        'expected_update' => false,
    ],
    'technique_does_not_route' => [
        'deal' => ['CATEGORY_ID' => '0', 'STAGE_ID' => 'NEW'],
        'interest' => 'техника',
        'expected_update' => false,
    ],
    'empty_interest_does_not_route' => [
        'deal' => ['CATEGORY_ID' => '0', 'STAGE_ID' => 'NEW'],
        'interest' => '',
        'expected_update' => false,
    ],
];

$results = [];
$failed = false;
foreach ($cases as $name => $case) {
    $decision = routeDealByInterest($case['deal'], [], $case['interest']);
    $actualUpdate = ($decision['should_update'] ?? false) === true;
    $passed = $actualUpdate === $case['expected_update'];

    if ($actualUpdate) {
        $passed = $passed
            && (string) ($decision['category_id'] ?? '') === $case['expected_category']
            && (string) ($decision['stage_id'] ?? '') === $case['expected_stage'];
    }

    $failed = $failed || !$passed;
    $results[$name] = [
        'passed' => $passed,
        'decision' => $decision,
    ];
}

$dialogCases = [
    'dialog_id' => [
        'context' => ['dialog_id' => 'chat123', 'chat_id' => '456'],
        'expected' => 'chat123',
    ],
    'chat_id' => [
        'context' => ['dialog_id' => '', 'chat_id' => '456'],
        'expected' => 'chat456',
    ],
    'numeric_dialog_id' => [
        'context' => ['dialog_id' => '789', 'chat_id' => ''],
        'expected' => 'chat789',
    ],
];

foreach ($dialogCases as $name => $case) {
    $actual = normalizeNotificationDialogId($case['context']);
    $passed = $actual === $case['expected'];
    $failed = $failed || !$passed;
    $results['dialog_' . $name] = [
        'passed' => $passed,
        'expected' => $case['expected'],
        'actual' => $actual,
    ];
}

echo json_encode([
    'ok' => !$failed,
    'results' => $results,
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) . PHP_EOL;

exit($failed ? 1 : 0);
