<?php

namespace App\Http\Controllers;

use App\Mail\ReceptionMail;
use App\Models\Appointment;
use App\Models\Attachment;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\{Auth, Storage, Mail};
use Illuminate\Support\Str;
use App\Mail\NotifySubmissionMail;
use Illuminate\Support\Facades\Log;
use App\MailHelper;

class AppointmentController extends Controller
{
    public function create()
    {
        return view('appointments.create');
    }

    public function store(Request $request)
    {
        $request->merge(
            ['mobile' => $request->input('country_code') . $request->input('phone')]
        );

        $validated = $request->validate([
            'phone' => [
                'required',
                'string',
                'regex:/^[0-9+\s]+$/',
                'min:8',
            ],
            'first_name' => 'required|string|max:100',
            'last_name' => 'required|string|max:100',
            'email' => 'nullable|email|max:255',
            'subject' => 'required|string|max:255',
            'message' => 'nullable|string',
            'requested_at' => [
                'nullable',
                function ($attribute, $value, $fail) {
                    try {
                        $requestedAt = Carbon::parse($value);

                        if ($requestedAt->isPast()) {
                            $fail('La date souhaitée doit être dans le futur.');
                            return;
                        }
                        $duration = (int) config('services.appointment.min_duration');

                        if ($requestedAt->lessThan(now()->addHours($duration))) {
                            $fail("La date souhaitée doit être au moins ".$duration."heures après la soumission de la demande.");
                        }
                    } catch (\Exception $e) {
                        $fail('Impossible de parser la date fournie.');
                    }
                },
            ],

            'duration_minutes' => 'nullable|integer|min:5|max:240',
            'service' => 'required|string',
            'level' => 'required|in:low,medium,high',
            'requerer_type_id' => 'required|exists:requerer_types,id',
            'uploads.*' => 'nullable|file|max:5120'
        ], [
            'phone.required' => 'Le numéro de téléphone est obligatoire.',

            'first_name.required' => 'Le prénom est obligatoire.',
            'first_name.string' => 'Le prénom doit être une chaîne de caractères.',
            'first_name.max' => 'Le prénom ne peut pas dépasser 100 caractères.',

            'last_name.required' => 'Le nom est obligatoire.',
            'last_name.string' => 'Le nom doit être une chaîne de caractères.',
            'last_name.max' => 'Le nom ne peut pas dépasser 100 caractères.',

            'email.email' => 'L\'adresse email doit être valide.',
            'email.max' => 'L\'adresse email ne peut pas dépasser 255 caractères.',

            'subject.required' => 'L’objet de la demande est obligatoire.',
            'subject.string' => 'L’objet doit être une chaîne de caractères.',
            'subject.max' => 'L’objet ne peut pas dépasser 255 caractères.',

            'message.string' => 'Le message doit être une chaîne de caractères.',

            'requested_at.string' => 'La date demandée doit être du texte interprétable.',

            'duration_minutes.integer' => 'La durée doit être un nombre entier.',
            'duration_minutes.min' => 'La durée minimale est de 5 minutes.',
            'duration_minutes.max' => 'La durée maximale est de 240 minutes.',

            'service.required' => 'Le service est obligatoire.',
            'service.string' => 'Le service doit être une valeur valide.',

            'uploads.*.file' => 'Chaque fichier doit être un fichier valide.',
            'uploads.*.max' => 'Chaque fichier ne peut pas dépasser 5 Mo.',
        ]);
        $uploads_data = [];
        if ($request->hasFile('uploads')) {
            foreach ($request->file('uploads') as $file) {
                $originalName = $file->getClientOriginalName();
                $extension = $file->getClientOriginalExtension();
                $fileName = Str::random(40) . '.' . $extension;
                $path = $file->storeAs('files/', $fileName, 'public');

                $uploads_data[] = [
                    'original_name' => $originalName,
                    'stored_name' => $fileName,
                    'path' => $path,
                    'size' => $file->getSize(),
                    'mime_type' => $file->getMimeType(),
                    'uploaded_at' => now()->toDateTimeString()
                ];
            }
        }
        // Parse requested_at using Carbon flexible parsing
        $requestedAt = null;
        if (!empty($validated['requested_at'])) {
            try {
                $requestedAt = Carbon::parse($validated['requested_at'])->format('Y-m-d H:i:s');
            } catch (\Exception $e) {
                return back()->withInput()->withErrors(['requested_at' => 'Impossible de parser la date fournie.']);
            }
        }
        $rawPhone = trim($request->phone);

        // Nettoyage : enlever espaces et caractères inutiles
        $phone = preg_replace('/\s+/', '', $rawPhone);

        // CAS 1 : 8 chiffres → numéro béninois sans préfixe
        if (preg_match('/^\d{8}$/', $phone)) {
            $phone = '22901' . $phone;
        }

        // CAS 2 : 10 chiffres et commence par 01 → béninois
        elseif (preg_match('/^01\d{8}$/', $phone)) {
            $phone = '229' . $phone;
        }


        // CAS 4 : tout autre format → on garde tel quel (comme demandé)

        $appointment = Appointment::create([
            'first_name' => $validated['first_name'],
            'last_name' => $validated['last_name'],
            'email' => $validated['email'] ?? null,
            'mobile' => $phone,
            'subject' => $validated['subject'],
            'message' => $validated['message'] ?? null,
            'requested_at' => $requestedAt,
            'duration_minutes' => $validated['duration_minutes'] ?? 30,
            'uploads' => $uploads_data,
            'request_code' => generateRequestCode(),
            'status' => 'pending',
            'service_id' => (int) $validated['service'],
            'level' => $validated['level'],
            'requerer_type_id' => $validated['requerer_type_id'],

        ]);
        $service = $appointment->service->name;
        // Message d'introduction
        $message = "Bonjour {$appointment->first_name} {$appointment->last_name},\n";
        $message .= "Vous recevez ce message en réponse à votre demande d'audience au près du {$service} de l'Université d'Abomey-Calavi concernant l'objet : *{$appointment->subject}*.\n\n. Votre demande a été bien reçue.\n. Pour suivre l'évolution votre demande veuillez utiliser le code suivant: *{$appointment->request_code}*";
        $end_message = "\nLe {$service}";

        $final_message = $message . $end_message;

        Log::info('Message final envoyé', ['message' => $final_message]);


        // ========== ENVOI WHATSAPP ==========

        $params = [
            'token' => config('services.ultra_msg.token'),
            'to' => $appointment->mobile,
            'image' => 'https://ifri-uac.bj/assets/img/logouac.png',
            'caption' => $final_message
        ];

        Log::info('Params envoyés WhatsApp', $params);

        $curl = curl_init();
        curl_setopt_array($curl, [
            CURLOPT_URL => "https://api.ultramsg.com/instance113582/messages/image",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query($params),
            CURLOPT_HTTPHEADER => ["Content-Type: application/x-www-form-urlencoded"],
            CURLOPT_SSL_VERIFYHOST => 0,
            CURLOPT_SSL_VERIFYPEER => 0,
        ]);

        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);

        if ($err) {
            Log::error("Erreur cURL UltraMsg", ['error' => $err]);
        } else {
            Log::info("Réponse UltraMsg", ['response' => $response]);
        }


        // ========== ENVOI MAIL ==========
        if (!empty($appointment->email)) {
            Mail::to($appointment->email)->send(new ReceptionMail([
                'name' => $appointment->first_name . " " . $appointment->last_name,
                'subject' => "Réponse à votre demande d'audience auprès du {$service} de l'Université d'Abomey-Calavi",
                'object' => $appointment->subject,
                'service' => $service,
                'code' => $appointment->request_code,
                'image' => 'https://ifri-uac.bj/assets/img/logouac.png',
            ]));
        } else {
            Log::warning("Pas d'email pour cet utilisateur, mail non envoyé", ['appointment_id' => $appointment->id]);
        }

        // handle attachments

        toast('Votre demande de demande d\'audience a été soumise avec succès. Veuillez consulter votre boite mail et/ou votre application whatsapp pour recevoir le code de suivi de votre demande', 'success');



        return redirect()->back();

    }

    public function track($code)
    {
        $appointment = Appointment::with('service')->where('request_code', $code)->first();

        if (!$appointment) {
            return response()->json(['error' => 'Code introuvable'], 404);
        }
        return response()->json([
            'appointment' => $appointment
        ]);
    }

}
