<?php

namespace App\Http\Controllers\VoyagedifiantDashboard;

use App\Http\Controllers\Controller;
use App\Models\Site;
use Illuminate\Http\Request;
use App\Models\SiteImage;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;

class formeSiteController extends Controller
{
    public function showForm()
{
    return view('page.formSite');
}

public function store(Request $request)
{
    // Validation des données
    $validated = $request->validate([
        'name' => 'required|string|max:255',
        'location' => 'required|string|max:255',
        'lat' => 'required|numeric|between:-90,90',
        'longi' => 'required|numeric|between:-180,180',
        'description_fr' => 'required|string|min:10|max:2000',
        'description_en' => 'required|string|min:10|max:2000',
        'standard_price' => 'required|integer|min:0',
        'premium_price' => 'required|integer|min:0',
        'visit_start_time' => 'required|date_format:H:i',
        'visit_end_time' => 'required|date_format:H:i',
        'images' => 'required|array|min:1|max:10',
        'images.*' => 'image|mimes:jpeg,png,jpg|max:2048'
    ], [
        'name.required' => 'Le nom du site est obligatoire.',
        'location.required' => 'Le lieu est obligatoire.',
        'lat.required' => 'La latitude est obligatoire.',
        'lat.numeric' => 'La latitude doit être un nombre valide.',
        'lat.between' => 'La latitude doit être entre -90 et 90 degrés.',
        'longi.required' => 'La longitude est obligatoire.',
        'longi.numeric' => 'La longitude doit être un nombre valide.',
        'longi.between' => 'La longitude doit être entre -180 et 180 degrés.',
        'description_fr.required' => 'La description en français est obligatoire.',
        'description_fr.min' => 'La description en français doit contenir au moins 10 caractères.',
        'description_en.required' => 'La description en anglais est obligatoire.',
        'description_en.min' => 'La description en anglais doit contenir au moins 10 caractères.',
        'standard_price.required' => 'Le prix standard est obligatoire.',
        'standard_price.integer' => 'Le prix standard doit être un nombre entier.',
        'standard_price.min' => 'Le prix standard ne peut pas être négatif.',
        'premium_price.required' => 'Le prix premium est obligatoire.',
        'premium_price.integer' => 'Le prix premium doit être un nombre entier.',
        'premium_price.min' => 'Le prix premium ne peut pas être négatif.',
        'visit_start_time.required' => 'L\'heure d\'ouverture est obligatoire.',
        'visit_start_time.date_format' => 'Format d\'heure invalide pour l\'ouverture.',
        'visit_end_time.required' => 'L\'heure de fermeture est obligatoire.',
        'visit_end_time.date_format' => 'Format d\'heure invalide pour la fermeture.',
        'images.required' => 'Au moins une image est requise.',
        'images.min' => 'Au moins une image est requise.',
        'images.max' => 'Maximum 10 images autorisées.',
        'images.*.image' => 'Les fichiers doivent être des images.',
        'images.*.mimes' => 'Seuls les formats JPG, PNG et JPEG sont autorisés.',
        'images.*.max' => 'Chaque image ne doit pas dépasser 2MB.'
    ]);

    try {
        DB::beginTransaction();

        // Validation supplémentaire des prix
        if ($validated['premium_price'] <= $validated['standard_price']) {
            return back()
                ->withInput()
                ->with('error', 'Le prix premium doit être supérieur au prix standard');
        }

        // Validation des heures
        $startTime = strtotime($validated['visit_start_time']);
        $endTime = strtotime($validated['visit_end_time']);

        if ($endTime <= $startTime) {
            return back()
                ->withInput()
                ->with('error', 'L\'heure de fermeture doit être après l\'heure d\'ouverture');
        }

        // Création du site avec conversion explicite
        $site = Site::create([
            'name' => $validated['name'],
            'location' => $validated['location'],
            'lat' => floatval($validated['lat']),
            'longi' => floatval($validated['longi']),
            'description_fr' => $validated['description_fr'],
            'description_en' => $validated['description_en'],
            'standard_price' => intval($validated['standard_price']),
            'premium_price' => intval($validated['premium_price']),
            'visit_start_time' => $validated['visit_start_time'],
            'visit_end_time' => $validated['visit_end_time']
        ]);

        // Traitement des images
        if ($request->hasFile('images')) {
            foreach ($request->file('images') as $image) {
                $path = $image->store('sites/images', 'public');
                $site->images()->create(['images_path' => $path]);
            }
        }

        DB::commit();

        return redirect()->route('listeSite')
               ->with('show_success_modal', true)
               ->with('modal_message', 'Site créé avec succès');

    } catch (\Exception $e) {
        DB::rollBack();

        Log::error("Erreur création site", [
            'error' => $e->getMessage(),
            'trace' => $e->getTraceAsString(),
            'data' => $request->except(['images'])
        ]);

        return back()
               ->withInput()
               ->with('error', 'Une erreur est survenue lors de la création du site: '.$e->getMessage());
    }
}
}
