<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ScheduleRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true;
    }

    public function rules(): array
    {
        $rules = [
            'client_id'                => 'sometimes|required|exists:clients,id',
            'provider_id'              => 'sometimes|required|exists:providers,id',
            'address_id'               => 'sometimes|required|exists:addresses,id',
            'date'                     => 'nullable|date|after_or_equal:today',
            'dates'                    => 'nullable|array',
            'dates.*'                  => 'date|after_or_equal:today',
            'offers_meal'              => 'sometimes|nullable|boolean',
            'period_type'              => 'sometimes|required|in:2,4,6,8',
            'schedule_type'            => 'sometimes|in:default,custom',
            'start_time'               => 'sometimes|required|date_format:H:i',
            'end_time'                 => 'sometimes|required|date_format:H:i|after:start_time',
            'total_amount'             => 'sometimes|required|numeric|min:0',
            'status'                   => 'sometimes|in:pending,accepted,rejected,paid,cancelled,started,finished',
            'code_verified'            => 'sometimes|boolean',
        ];

        if ($this->isMethod('POST')) {
            $rules['client_id']    = 'required|exists:clients,id';
            $rules['provider_id']  = 'required|exists:providers,id';
            $rules['address_id']   = 'required|exists:addresses,id';
            $rules['date']         = 'required_without:dates|nullable|date|after_or_equal:today';
            $rules['dates']        = 'nullable|array';
            $rules['dates.*']      = 'date|after_or_equal:today';
            $rules['period_type']  = 'required|in:2,4,6,8';
            $rules['start_time']   = 'required|date_format:H:i';
            $rules['end_time']     = 'required|date_format:H:i|after:start_time';
            $rules['total_amount'] = 'required|numeric|min:0';
            $rules['status']       = 'in:pending';
        }

        return $rules;
    }

    public function messages(): array
    {
        return [
            'client_id.required'     => 'O cliente é obrigatório.',
            'client_id.exists'       => 'Cliente não encontrado.',
            'provider_id.required'   => 'O prestador é obrigatório.',
            'provider_id.exists'     => 'Prestador não encontrado.',
            'address_id.required'    => 'O endereço é obrigatório.',
            'address_id.exists'      => 'Endereço não encontrado.',
            'date.required_without'  => 'A data é obrigatória quando não há múltiplas datas.',
            'date.date'              => 'Data inválida.',
            'date.after_or_equal'    => 'A data deve ser hoje ou futura.',
            'dates.array'            => 'Datas devem ser um array.',
            'dates.*.date'           => 'Uma das datas é inválida.',
            'dates.*.after_or_equal' => 'Todas as datas devem ser hoje ou futuras.',
            'period_type.required'   => 'O período é obrigatório.',
            'period_type.in'         => 'Período inválido.',
            'start_time.required'    => 'O horário de início é obrigatório.',
            'start_time.date_format' => 'Formato de horário inválido.',
            'end_time.required'      => 'O horário de término é obrigatório.',
            'end_time.date_format'   => 'Formato de horário inválido.',
            'end_time.after'         => 'O horário de término deve ser após o horário de início.',
            'total_amount.required'  => 'O valor total é obrigatório.',
            'total_amount.numeric'   => 'O valor total deve ser numérico.',
            'total_amount.min'       => 'O valor total deve ser maior ou igual a zero.',
            'status.in'              => 'Status inválido.',
        ];
    }
}
