<?php

if (!function_exists('tipoPaqueteValidValues')) {
    function tipoPaqueteValidValues(): array
    {
        return [
            'RUTA',
            'CONTRAENTREGA',
            'NO CONTESTA, VOLVER A LLAMAR',
            'PENDIENTE A RETORNO',
            'COMPLETADO',
            'PREPARADO',
            'RETORNADO',
            'ANULADO',
        ];
    }
}

if (!function_exists('tipoPaquetePrimarySelectorValues')) {
    function tipoPaquetePrimarySelectorValues(): array
    {
        return [
            'PREPARADO',
            'RUTA',
            'ANULADO',
            'PENDIENTE A RETORNO',
            'RETORNADO',
            'COMPLETADO',
        ];
    }
}

if (!function_exists('normalizeTipoPaqueteValue')) {
    function normalizeTipoPaqueteValue($value): ?string
    {
        if ($value === null || is_array($value)) {
            return null;
        }

        $value = (string) $value;
        $value = preg_replace('/[\x{00A0}\x{200B}-\x{200D}\x{FEFF}]+/u', ' ', $value);
        $value = preg_replace('/[\x00-\x1F\x7F]+/u', ' ', $value);
        $value = preg_replace('/\s+/u', ' ', trim($value));

        if ($value === '') {
            return null;
        }

        $normalized = function_exists('mb_strtoupper') ? mb_strtoupper($value, 'UTF-8') : strtoupper($value);
        $match = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $normalized);
        if ($match === false || $match === null || $match === '') {
            $match = $normalized;
        }

        $canonicalKey = preg_replace('/[^A-Z]+/', '', strtoupper($match));
        $aliases = [
            'RUTA' => 'RUTA',
            'CONTRAENTREGA' => 'CONTRAENTREGA',
            'NOCONTESTAVOLVERALLAMAR' => 'NO CONTESTA, VOLVER A LLAMAR',
            'PENDIENTEARETORNO' => 'PENDIENTE A RETORNO',
            'COMPLETADO' => 'COMPLETADO',
            'EMPAQUETADO' => 'PREPARADO',
            'PREPARADO' => 'PREPARADO',
            'EMPACADO' => 'PREPARADO',
            'EMPAQUETARDO' => 'PREPARADO',
            'RETORNADO' => 'RETORNADO',
            'ANULADO' => 'ANULADO',
        ];

        return $aliases[$canonicalKey] ?? $normalized;
    }
}

if (!function_exists('tipoPaqueteIsValid')) {
    function tipoPaqueteIsValid(?string $value): bool
    {
        return $value === null || in_array($value, tipoPaqueteValidValues(), true);
    }
}

if (!function_exists('ensureTipoPaqueteEnumDefinition')) {
    function ensureTipoPaqueteEnumDefinition(PDO $pdo, bool $force = false): void
    {
        static $checked = false;

        if ($checked && !$force) {
            return;
        }

        $stmt = $pdo->query("SHOW COLUMNS FROM pedidos LIKE 'tipo_paquete'");
        $column = $stmt ? $stmt->fetch(PDO::FETCH_ASSOC) : false;
        if (!$column || empty($column['Type'])) {
            $checked = true;
            return;
        }

        $currentType = (string) $column['Type'];
        $validValues = tipoPaqueteValidValues();
        $missingRequiredValue = false;

        foreach ($validValues as $value) {
            if (strpos($currentType, "'" . str_replace("'", "''", $value) . "'") === false) {
                $missingRequiredValue = true;
                break;
            }
        }

        $hasLegacyPendiente = strpos($currentType, "'PENDIENTE'") !== false;
        $hasLegacyEmpaquetado = strpos($currentType, "'EMPAQUETADO'") !== false;

        if ($force || $missingRequiredValue || $hasLegacyPendiente || $hasLegacyEmpaquetado) {
            $quotedValues = array_map(static function (string $value) use ($pdo): string {
                return $pdo->quote($value);
            }, $validValues);
            $enumValuesSql = implode(', ', $quotedValues);

            $transitionValues = array_values(array_unique(array_merge(
                $validValues,
                ['EMPAQUETADO', 'PENDIENTE', 'NO CONTESTA', 'VOLVER A LLAMAR']
            )));
            $quotedTransitionValues = array_map(static function (string $value) use ($pdo): string {
                return $pdo->quote($value);
            }, $transitionValues);
            $transitionValuesSql = implode(', ', $quotedTransitionValues);

            $pdo->exec("ALTER TABLE pedidos MODIFY COLUMN tipo_paquete ENUM($transitionValuesSql) DEFAULT NULL");
            $pdo->exec("UPDATE pedidos SET tipo_paquete = 'PREPARADO' WHERE tipo_paquete = 'EMPAQUETADO'");
            $pdo->exec("UPDATE pedidos SET tipo_paquete = 'NO CONTESTA, VOLVER A LLAMAR' WHERE tipo_paquete IN ('NO CONTESTA', 'VOLVER A LLAMAR')");
            $pdo->exec("UPDATE pedidos SET tipo_paquete = NULL WHERE tipo_paquete = 'PENDIENTE'");
            $pdo->exec("UPDATE pedidos SET tipo_paquete = NULL WHERE tipo_paquete IS NOT NULL AND tipo_paquete NOT IN ($enumValuesSql)");
            $pdo->exec("ALTER TABLE pedidos MODIFY COLUMN tipo_paquete ENUM($enumValuesSql) DEFAULT NULL");
        }

        $checked = true;
    }
}
