<?php

namespace App\Http\Controllers;

use Illuminate\Validation\Rule;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\User;
use App\Models\Offers;
use App\Notifications\InscriptionNotification;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use App\Models\Filiere;
use Illuminate\Support\Facades\Crypt;

class AuthController extends Controller
{
    public function showLoginForm()
    {
        return view('auth.login');
    }

    public function login(Request $request)
{
    // Validation des données d'entrée
    $request->validate([
        'email' => 'required|email',
        'password' => 'required|min:6',
    ]);

    if (Auth::attempt($request->only('email', 'password'))) {
        $user = auth()->user();

        if ($user->email === 'admin@ine-uac.com' && Hash::check('admin2024', $user->password)) {
            return redirect()->route('admin.index');
        }

        return redirect()->route('etudiants.index');
    }

    return back()->withErrors([
        'email' => 'Ces identifiants ne correspondent pas.',
    ])->withInput();
}

    public function showRegisterForm()
    {
        $filieres = DB::connection('tenant')
            ->table('filieres')
            ->select('intituleFilieres', 'idFiliere')
            ->orderBy('idFiliere')
            ->get();


        $statuts = DB::connection('tenant')
            ->table('statuts')
            ->whereNotIn('idStatut', [2, 3, 4, 5])
            ->get();

        $code_pays = DB::connection('tenant_2')
            ->table('codePays')
            ->orderBy('intitulePays', 'ASC')
            ->get();

        $niveaux = DB::connection('tenant')
            ->table('niveauformation')
            ->get();

        return view('auth.register', compact('filieres', 'statuts', 'code_pays', 'niveaux'));

        // return view('auth.register');
    }

    public function register(Request $request)
    {

        // Verifier si l'utilisateur a déjà un compte AfricaWebStudent

        $aws_account = DB::connection('tenant_2')
            ->table('users_student')
            ->where('email', $request->email)
            ->first();

        if(!empty($aws_account)){
            return redirect()->back()->withErrors(['error' => "Vous disposez déjà d'un compte sur la plateforme. Veuillez vous connecter directement."]);
        }

        // Processus de pré-inscription AfricaWebStudent

        $periode = DB::connection('tenant')
            ->table('periodeinscription')
            ->where('affiche', 'YES')
            ->first();

        $idUniversite = DB::connection('tenant')
            ->table('universite')
            ->first()
            ->idUniversite;

        $idEtablissement = DB::connection('tenant')
            ->table('etablissement')
            ->first()
            ->idEtablissement;

        $matricule = $idUniversite . $idEtablissement . str_pad($request->filiere, 2, '0', STR_PAD_LEFT) . random_int(100000, 999999) . substr($periode->annee_acad, -2);

        DB::connection('tenant')
            ->table('tabetudiant')
            ->insert([
                'matricule' => $matricule,
                'nom' => mb_strtoupper(strtolower(trim($request->name))),
                'prenom' => ucwords(strtolower(trim($request->surname))),
                'cheminPhoto' => 'imageEtudiant/votrephoto.jpg',
                'email' => $request->email,
                'adresse' => $request->phone,
                'code_pays' => $request->code_pays,
                'date_nais' => $request->birthday,
                'lieu_nais' => $request->birthplace,
                'sexe' => $request->sexe,
                'nationalite' => $request->nationalite,
            ]);

        DB::connection('tenant')
            ->table('tabinscription')
            ->insert([
                'matricule' => $matricule,
                'idFiliere' => $request->filiere,
                'annee' => 3,
                'niveauFormation' => $request->niveau,
                'annee_acad' => $periode->annee_acad,
                'code_preinscription' => 0,
                'estAssure' => 'NO',
                'statut' => $request->statutAlumnis
            ]);

        $codeUnites = DB::connection('tenant')
            ->table('unites')
            ->where([
                'annee' => 3,
                'idFiliere' => $request->filiere,
                'niveauFormation' => $request->niveau,
                'annee_acad' => $periode->annee_acad
        ])->get();

        foreach($codeUnites as $code) {

            DB::connection('tenant')
            ->table('tabinscriunite')
            ->insert([
                'matricule' => $matricule,
                'code_unite' => $code->code_unite,
                'premiere_inscription' => $periode->annee_acad,
                'inscription_actuelle' => $periode->annee_acad,
                'annee' => 3,
                'niveauFormation' => $request->niveau,
                'idFiliere' => $request->filiere,
                'resultat' => 'R'
            ]);

        }

        // Enregistrement de l'attestation jointe par l'étudiant dans la base de données locale

        $attestationPath = null;
        if ($request->hasFile('attestation')) {
            $attestationPath = $request->file('attestation')->store('attestations', 'public');
        }

        // Enregistrement des informations de l'étudiant dans la bd locale

        $user = User::create([
            'name' => mb_strtoupper(strtolower(trim($request->name))),
            'surname' => ucwords(strtolower(trim($request->surname))),
            'email' => $request->email,
            'attachment' => $attestationPath,
            'phone' => $request->phone,
            'birthday' => $request->birthday,
            'birthplace' => $request->birthplace,
            'matricule' => $matricule,
            'sexe' => $request->sexe,
            'nationalite' => $request->nationalite,
            'photo_path' => 'imageEtudiant/votrephoto.jpg',
            'code_pays' => $request->code_pays
        ]);

        // Quelques informations liées à AfricaWebStudent sont enregistrées au niveau de la bd locale

        DB::table('aws_infos')->insert([
            'user_id' => $user->id,
            'statutAlumnis_id' => $request->statutAlumnis,
            'niveau_id' => $request->niveau,
            'filiere_id' => $request->filiere
        ]);

        // Notifier l'utilisateur par mail que ses informations ont été bien reçues

        $user->notify(new InscriptionNotification($user));

        // Notification par Whatsapp

        $url = config('services.api_for_whatsapp_msg.url'). '/chat';

        $message = "*ALMUNIS INE* \n\n\n".
            "Bonjour " . $user->name. "\n\n".
            "Votre inscription vient d'être enregistrée sur la plateforme des Alumnis de l'Institut National de l'Eau (INE).\n\n".
            "Les administrateurs de la plateforme procédéront à la vérification puis à la validation ou non de votre inscription dans les prochaines heures. Par la suite, une notification vous sera envoyée afin de connaitre le statut de votre inscription.\n\n\n".
            "Cordialement, L'équipe.";

        $params = array(
            'token' => config('services.api_for_whatsapp_msg.token'),
            'to' => $user->code_pays . $user->phone,
            'body' => $message
        );

        sendWhatsappMsg($url, $params);

        return redirect()->back()->with('success', 'Inscription réussie!');

        // return back()->with('error', "L'inscription a échoué. Veuillez réessayer.");
    }


    public function logout()
    {
        Auth::logout();
        return redirect('/');
    }

    public function edit($token)
    {
        try {
            $userId = Crypt::decrypt($token); // Déchiffrez le token
            $user = User::findOrFail($userId);
    
            return view('alumnis.modification_form', compact('user'));
        } catch (\Illuminate\Contracts\Encryption\DecryptException $e) {
            abort(404, 'Lien invalide ou expiré.'); // Gérer les erreurs de décryptage
        }
    }
    /**
     * Update the specified user's information.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\RedirectResponse
     *
     * This method validates the incoming request data and updates the user's
     * information in the database. It then redirects to the modification page
     * with a success message upon successful update.
     */

     public function update(Request $request, $id)
     {
         $user = User::find($id);
         if (!$user) {
             return redirect()->back()->with('error', 'Utilisateur non trouvé.');
         }
 
         // Validation des données
         $validatedData = $request->validate([
             'name' => 'required|string|max:255',
             'surname' => 'required|string|max:255',
             'email' => [
                 'required',
                 'string',
                 'email',
                 'max:255',
                 Rule::unique('users')->ignore($id),  
             ],
             'phone' => 'nullable|string|max:15',
             'birthday' => 'nullable|date',
             'birthplace' => 'nullable|string|max:255', 
             'matricule' => 'nullable|string|max:255',
             'address' => 'nullable|string|max:255',
             'attachment' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:2048', 
         ]);
 
         // Mise à jour des données utilisateur
         $user->fill($validatedData);
  
         if ($request->hasFile('attachment')) {
             $file = $request->file('attachment');
             $path = $file->store('attachments', 'public');  
             $user->attachment = $path;
         }
  
         $user->save();
 
         return redirect()->route('welcome')->with('success', 'Informations modifiées avec succès.');
     }

     public function createFilieres()
     { 
         $filieres = Filiere::all(); 
         return view('auth.register', compact('filieres'));  
     }
     
}
