<?php
namespace EasyChat\Library\Delivery;

 
final class TrackingStatus
{
    public const CREATED = 'created';
    public const ACCEPTED = 'accepted';
    public const IN_TRANSIT = 'in_transit';
    public const READY_FOR_PICKUP = 'ready_for_pickup';
    public const DELIVERED = 'delivered';
    public const DELAYED = 'delayed';
    public const RETURNING = 'returning';
    public const RETURNED = 'returned';
    public const PROBLEM = 'problem';
    public const UNKNOWN = 'unknown';

    public static function fromText(string $value): string
    {
        $value = mb_strtolower(trim($value), 'UTF-8');
        if ($value === '') return self::UNKNOWN;
        if (preg_match('/delivered|вруч|доставлен|получен|вручен/u', $value)) return self::DELIVERED;
        if (preg_match('/ready_for_pickup|ready.*pickup|готов.*выдач|ожидает.*получ|поступил.*(пвз|пункт.*выдач)|прибыл.*место/u', $value)) return self::READY_FOR_PICKUP;
        if (preg_match('/возвращен|возвращён/u', $value)) return self::RETURNED;
        if (preg_match('/returned/u', $value)) return self::RETURNED;
        if (preg_match('/return|возврат|возвращается/u', $value)) return self::RETURNING;
        if (preg_match('/задерж|просроч/u', $value)) return self::DELAYED;
        if (preg_match('/неудач|утрач|отказ|ошиб|проблем/u', $value)) return self::PROBLEM;
        if (preg_match('/accepted|created|принят|при[её]м|создан/u', $value)) return self::ACCEPTED;
        if (preg_match('/transit|departed|транзит|следует|перевоз|сортир|отправлен|в пути/u', $value)) return self::IN_TRANSIT;
        return self::UNKNOWN;
    }

    public static function label(string $status): string
    {
        return array(
            self::CREATED => 'Отправление создано',
            self::ACCEPTED => 'Принято перевозчиком',
            self::IN_TRANSIT => 'В пути',
            self::READY_FOR_PICKUP => 'Готово к выдаче',
            self::DELIVERED => 'Доставлено',
            self::DELAYED => 'Доставка задерживается',
            self::RETURNING => 'Возвращается отправителю',
            self::RETURNED => 'Возвращено отправителю',
            self::PROBLEM => 'Требуется внимание',
        )[$status] ?? 'Статус уточняется';
    }

     
    public static function isTerminal(string $status): bool
    {
        return in_array($status, array(self::DELIVERED, self::RETURNED), true);
    }

     
    public static function refreshTtl(string $status): int
    {
        if (self::isTerminal($status)) return 86400;
        if (in_array($status, array(self::DELAYED, self::RETURNING, self::PROBLEM), true)) return 180;
        if ($status === self::READY_FOR_PICKUP) return 900;
        return 300;
    }
}
