<?php

declare(strict_types=1);

namespace App\Services\Supplier\Import;

/**
 * Pure-хелперы перевода полей строки rt-проекта поставщика → поля Лидерры.
 * Без побочных эффектов и зависимостей — только статические функции.
 *
 * Spec: docs/superpowers/specs/2026-05-22-supplier-projects-import-lkomega-design.md §4
 */
final class SupplierImportMapper
{
    private const SRC_TO_PLATFORM = ['rt' => 'B1', 'bl' => 'B2', 'mt' => 'B3'];

    private const TYPE_TO_SIGNAL = ['calls' => 'call', 'hosts' => 'site', 'sms' => 'sms'];

    public static function platformFromSrc(string $src): ?string
    {
        return self::SRC_TO_PLATFORM[$src] ?? null;
    }

    public static function signalTypeFromType(string $type): ?string
    {
        return self::TYPE_TO_SIGNAL[$type] ?? null;
    }

    /**
     * Строку ГИБДД-кодов («24», «24,77», «24, 77 78») → list<int>.
     * Пусто/null → [].
     *
     * @return list<int>
     */
    public static function parseGibddRegions(?string $regions): array
    {
        if ($regions === null) {
            return [];
        }
        $parts = preg_split('/[,\s]+/', trim($regions), -1, PREG_SPLIT_NO_EMPTY);
        if ($parts === false || $parts === []) {
            return [];
        }

        return array_map(static fn (string $p): int => (int) $p, $parts);
    }

    /**
     * Список дней-строк ["1".."7"] (1=Пн..7=Вс ISO) → битовая маска (bit0=Пн).
     * Пусто → 127 (все дни).
     *
     * @param  list<int|string>  $workdays
     */
    public static function workdaysToMask(array $workdays): int
    {
        if ($workdays === []) {
            return 127;
        }
        $mask = 0;
        foreach ($workdays as $d) {
            $day = (int) $d;
            if ($day >= 1 && $day <= 7) {
                $mask |= (1 << ($day - 1));
            }
        }

        return $mask === 0 ? 127 : $mask;
    }

    /**
     * sms-content: «sender+keyword» → ['sender'=>…, 'keyword'=>…];
     * «sender» (без плюса) → ['sender'=>…, 'keyword'=>null].
     *
     * @return array{sender: string, keyword: string|null}
     */
    public static function parseSmsContent(string $content): array
    {
        $plus = strpos($content, '+');
        if ($plus === false) {
            return ['sender' => $content, 'keyword' => null];
        }

        return [
            'sender' => substr($content, 0, $plus),
            'keyword' => substr($content, $plus + 1),
        ];
    }
}
