<?php

namespace App\Services;


class SearchValidator
{
    public static function validateNameSearch(array $data): array
    {
        if (empty(trim($data['paternal_surname'] ?? '')) || empty(trim($data['maternal_surname'] ?? '')) || empty(trim($data['name'] ?? ''))) {
            self::throw("Debe ingresar los apellidos y nombres del usuario.");
        }

        return [
            'paternal_surname' => $data['paternal_surname'],
            'maternal_surname' => $data['maternal_surname'],
            'name' => $data['name'],
            'start_date' => $data['start_date'] ?? null,
            'end_date' => $data['end_date'] ?? null,
        ];
    }

    public static function validateDniSearch(array $data): array
    {
        if (empty(trim($data['dni'] ?? ''))) {
            self::throw("Debe ingresar el dni del usuario.");
        }

        return [
            'dni' => $data['dni'],
            'start_date' => $data['start_date'] ?? null,
            'end_date' => $data['end_date'] ?? null,
        ];
    }

    public static function validateDateRangeSearch(array $data): array
    {
        if (empty(trim($data['start_date'] ?? '')) || empty(trim($data['end_date'] ?? ''))) {
            self::throw("Debe ingresar el rango de fechas para buscar.");
        }

        return [
            'start_date' => $data['start_date'],
            'end_date' => $data['end_date'],
        ];
    }

    public static function validatePrioritySearch(array $data): array
    {
        if (empty(trim($data['priority'] ?? ''))) {
            self::throw("Debe seleccionar el estado por el que desea filtrar los trámites.");
        }

        return [
            'priority' => $data['priority'],
            'start_date' => $data['start_date'] ?? null,
            'end_date' => $data['end_date'] ?? null,
        ];
    }

    public static function validateProcedureSearch(array $data): array
    {
        if (empty(trim($data['procedure_id'] ?? ''))) {
            self::throw("Debe seleccionar el procedimiento por el que desea filtrar los trámites.");
        }

        return [
            'procedure_id' => $data['procedure_id'],
            'start_date' => $data['start_date'] ?? null,
            'end_date' => $data['end_date'] ?? null,
        ];
    }

    public static function validateDerivationSearch(array $data): array
    {
        $groupingType = $data['grouping_type'] ?? '';
        $filters = [
            'grouping_type' => $groupingType,
            'start_date' => $data['start_date'] ?? null,
            'end_date' => $data['end_date'] ?? null,
        ];

        switch ($groupingType) {
            case 'day':
                if (empty($data['day_date'] ?? '')) {
                    self::throw("Debe seleccionar el día para agrupar.");
                }
                $filters['day_date'] = $data['day_date'];
                break;

            case 'month':
                if (empty($data['month'] ?? '') || empty($data['month_year'] ?? '')) {
                    self::throw("Debe seleccionar el mes y el año para agrupar por mes.");
                }
                $filters['month'] = $data['month'];
                $filters['month_year'] = $data['month_year'];
                break;

            case 'year':
                if (empty($data['year'] ?? '')) {
                    self::throw("Debe ingresar un año para agrupar por año.");
                }
                $filters['year'] = $data['year'];
                break;

            case 'period':
                if (empty($data['period'] ?? '')) {
                    self::throw("Debe seleccionar un período para agrupar.");
                }
                $filters['period'] = $data['period'];
                break;

            default:
                self::throw("Debe seleccionar un tipo de agrupamiento válido.");
        }

        return $filters;
    }

    public static function validateStateSearch(array $data, $isAdmin): array
    {
        $groupingType = $data['grouping_type'] ?? '';

        $filters = [
            'grouping_type' => $groupingType
        ];

        switch ($groupingType) {
            case 'day':
                if (empty($data['day_date'] ?? '')) {
                    self::throw("Debe seleccionar el día para agrupar.");
                }
                $filters['day_date'] = $data['day_date'];
                break;

            case 'month':
                if (empty($data['month'] ?? '') || empty($data['month_year'] ?? '')) {
                    self::throw("Debe seleccionar el mes y el año para agrupar por mes.");
                }
                $filters['month'] = $data['month'];
                $filters['month_year'] = $data['month_year'];
                break;

            case 'year':
                if (empty($data['year'] ?? '')) {
                    self::throw("Debe ingresar un año para agrupar por año.");
                }
                $filters['year'] = $data['year'];
                break;

            case 'period':
                if (empty($data['period'] ?? '')) {
                    self::throw("Debe seleccionar un período para agrupar.");
                }
                $filters['period'] = $data['period'];
                break;

            case 'range':
                if (empty($data['start_date']) || empty($data['end_date'])) {
                    self::throw("Debe seleccionar un rango de fechas en esta opción.");
                }
                $filters['start_date'] = $data['start_date'];
                $filters['end_date'] = $data['end_date'];
                break;

            default:
                //self::throw("Debe seleccionar un tipo de agrupamiento válido.");
        }

        if (isset($data['state']) && $data['state'] !== '') {
            $filters['state'] = strtoupper($data['state']);
        }

        if ($isAdmin) {
            if (!empty($data['area_id'])) {
                $filters['area_id'] = $data['area_id'];
            }
            if (!empty($data['group_type_id'])) {
                $filters['group_type_id'] = $data['group_type_id'];
            }
        }

        if (!empty($data['group_id'])) {
            $filters['group_id'] = $data['group_id'];
        }
        if (array_key_exists('subgroup_id', $data)) {
            $filters['subgroup_id'] = $data['subgroup_id'];
        }

        return $filters;
    }

    public static function validateProcessNumberSearch(array $data): array
    {
        if (empty(trim($data['period'] ?? '')) || empty(trim($data['num_exped'] ?? ''))) {
            self::throw("Debe seleccionar el periodo e ingresar el número de trámite.");
        }

        return [
            'period' => $data['period'],
            'num_exped' => $data['num_exped'],
        ];
    }

    private static function throw(string $message): void
    {
        $_SESSION['message'] = "Error: $message";
        $_SESSION['message_type'] = 'danger';
        header("Location: " . BASE_HEADER . "search");
        exit;
    }
}