<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class StoreDeliveryRequest extends FormRequest
{
    /**
     * Détermine si l'utilisateur est autorisé à faire cette requête.
     *
     * @return bool
     */
    public function authorize()
    {
        return true; // Autoriser toutes les requêtes pour le formulaire public
    }

    /**
     * Règles de validation pour la requête.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        return [
            // Informations marchand
            'nom_boutique' => ['required', 'string', 'max:255'],
            'whatsapp_marchand' => ['required', 'string', 'regex:/^\+229[0-9]{10,12}$/'],

            // Point de ramassage
            'latitude_ramassage' => ['required', 'numeric', 'between:-90,90'],
            'longitude_ramassage' => ['required', 'numeric', 'between:-180,180'],
            'repere_ramassage' => ['required', 'string', 'max:255'],
            'tel_ramassage' => ['required', 'string', 'regex:/^\+229[0-9]{10,12}$/'],

            // Point de livraison
            'nom_destinataire' => ['required', 'string', 'max:255'],
            'latitude_livraison' => ['required', 'numeric', 'between:-90,90'],
            'longitude_livraison' => ['required', 'numeric', 'between:-180,180'],
            'repere_livraison' => ['required', 'string', 'max:255'],
            'tel_destinataire' => ['required', 'string', 'regex:/^\+229[0-9]{10,12}$/'],

            // Détails du colis
            'type_colis' => ['required', 'string', Rule::in(['petit', 'moyen', 'grand'])],
            'montant_encaisser' => ['nullable', 'numeric', 'min:0', 'max:1000000'],
            'instructions' => ['nullable', 'string', 'max:500'],

            // Timing
            'heure_ramassage' => ['required', 'string', Rule::in(['8h-10h', '10h-14h', '14h-17h', '17h-19h'])],
            'date_livraison' => ['required', 'string', Rule::in(['aujourdhui', 'demain', 'apres-demain'])],
        ];
    }

    /**
     * Messages de validation personnalisés.
     *
     * @return array<string, string>
     */
    public function messages()
    {
        return [
            'nom_boutique.required' => 'Le nom de la boutique est obligatoire.',
            'whatsapp_marchand.required' => 'Le numéro WhatsApp est obligatoire.',
            'whatsapp_marchand.regex' => 'Le numéro WhatsApp doit être au format +229XXXXXXXXXX (10 à 12 chiffres après +229).',
            'latitude_ramassage.required' => 'La latitude du point de ramassage est obligatoire.',
            'latitude_ramassage.numeric' => 'La latitude doit être un nombre.',
            'longitude_ramassage.required' => 'La longitude du point de ramassage est obligatoire.',
            'longitude_ramassage.numeric' => 'La longitude doit être un nombre.',
            'repere_ramassage.required' => 'Le point de repère de ramassage est obligatoire.',
            'tel_ramassage.required' => 'Le téléphone de contact sur place est obligatoire.',
            'tel_ramassage.regex' => 'Le numéro de téléphone doit être au format +229XXXXXXXXXX (10 à 12 chiffres après +229).',
            'nom_destinataire.required' => 'Le nom du destinataire est obligatoire.',
            'latitude_livraison.required' => 'La latitude du point de livraison est obligatoire.',
            'latitude_livraison.numeric' => 'La latitude doit être un nombre.',
            'longitude_livraison.required' => 'La longitude du point de livraison est obligatoire.',
            'longitude_livraison.numeric' => 'La longitude doit être un nombre.',
            'repere_livraison.required' => 'Le point de repère de livraison est obligatoire.',
            'tel_destinataire.required' => 'Le téléphone du destinataire est obligatoire.',
            'tel_destinataire.regex' => 'Le numéro de téléphone doit être au format +229XXXXXXXXXX (10 à 12 chiffres après +229).',
            'type_colis.required' => 'Le type de colis est obligatoire.',
            'type_colis.in' => 'Le type de colis doit être petit, moyen ou grand.',
            'montant_encaisser.numeric' => 'Le montant à encaisser doit être un nombre.',
            'montant_encaisser.min' => 'Le montant à encaisser ne peut pas être négatif.',
            'montant_encaisser.max' => 'Le montant à encaisser ne peut pas dépasser 1 000 000 FCFA.',
            'instructions.max' => 'Les instructions ne peuvent pas dépasser 500 caractères.',
            'heure_ramassage.required' => 'L\'heure de ramassage est obligatoire.',
            'heure_ramassage.in' => 'L\'heure de ramassage doit être un créneau valide.',
            'date_livraison.required' => 'La date de livraison est obligatoire.',
            'date_livraison.in' => 'La date de livraison doit être aujourd\'hui, demain ou après-demain.',
        ];
    }

    /**
     * Gérer un échec de validation.
     *
     * @param  \Illuminate\Contracts\Validation\Validator  $validator
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
    {
        // Créer une exception de validation personnalisée qui redirige vers la page d'accueil
        $exception = new \Illuminate\Validation\ValidationException($validator);
        
        // Forcer la redirection vers la page d'accueil au lieu de back()
        $exception->redirectTo = url('/');
        
        throw $exception;
    }
}
