<?php

namespace App\Http\Controllers;

use App\Models\{Book, Book_Utilisateur, Discipline, Utilisateur, Matiere, Documentation, Notification};
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;

class BookController extends Controller
{
    public function index($slug)
    {
        if (!session()->has('BOOKCASE_USER'))
            return redirect()->route('accueil')->with('error', 'Connectez vous ...');

        $discipline = Discipline::where('slug', $slug)->first();
        return view('books.list', compact('discipline'));
    }

    public function retrait_book(Book $book)
    {
        if (!session()->has('BOOKCASE_USER'))
            return redirect()->route('accueil')->with('error', 'Connectez vous ...');

        $book->utilisateurs()->detach();
        return redirect()->route('mes_livres');
    }

    public function edit(Request $request)
    {
        $book = Book::where('id', $request->id)->first();
        $discipline = Discipline::all();
        return view('admin.edit', compact('book', 'discipline'));
    }

    public function editDoc(Request $request)
    {
        $document = Documentation::where('nom', $request->nom)->first();
        $matiere = Matiere::all();
        return view('admin.editDoc', compact('document', 'matiere'));
    }

    public function update(Request $request)
    {
        $book = Book::where('id', $request->id)->first();
        $book->update($request->all());
        $book->disciplines()->detach($book->disciplines()->get());
        $book->disciplines()->attach($request->discipline);
        return redirect()->route("all.books")->with('success', 'Modifications sauvegardées avec succès');;
    }

    public function updateDoc(Request $request)
    {
        $document = Documentation::where('id', $request->id)->first();
        $document->update($request->all());
        $document->matieres()->detach($document->matieres()->get());
        $document->matieres()->attach($request->matiere);
        return redirect()->route("cons.doc")->with('success', 'Modifications sauvegardées avec succès');
    }

    public function show($id)
    {
        if (!session()->has('BOOKCASE_ADMIN') && !session()->has('BOOKCASE_USER'))
            return redirect()->route('accueil')->with('error', 'Connectez vous ...');

        if (session()->has('BOOKCASE_ADMIN')) { //Si c'est la fonction est appelée depuis l'administrateur
            $book = Book::where('id', $id)->first();
            if ($book)
                return view('admin.read', compact('book'));
            else
                return redirect()->route('admin');
        } else if (session()->has('BOOKCASE_USER')) { ////Si c'est la fonction est appelée depuis l'utilisateur
            $book = Book::where([
                ['id', $id],
                ['etat', 1]
            ])->first();
            if ($book) {
                //Vérifier si le livre est dans son catalogue
                $user = unserialize(session('BOOKCASE_USER'));
                return view('books.read', compact('book'));
            } else
                return redirect()->route('mes_livres');
        }
    }

    public function show_doc($id)
    {
        if (!session()->has('BOOKCASE_USER'))
            return redirect()->route('accueil')->with('error', 'Connectez vous ...');
        $book = Documentation::where('id', $id)->first();
        if ($book) {
            //Vérifier si le livre est dans son catalogue
            $user = unserialize(session('BOOKCASE_USER'));
            return view('books.read', compact('book'));
        } else
            return redirect()->route('ma_doc');
    }

    public function store(Request $request)
    {
        if (!session()->has('BOOKCASE_ADMIN') && $request->hidden == 1)
            return redirect()->route('admin.login');
        else if (!session()->has('BOOKCASE_USER') && $request->hidden == 0)
            return redirect()->route('accueil')->with('error', 'Connectez vous ...');

        try {
            $request->validate([
                'titre' => 'bail|required|min:3',
                'auteur' => 'bail|required|min:3',
                'ISBN' => 'bail|required|numeric|min:10',
                'description' => 'bail|required|min:10',
                'discipline' => 'bail|required',
                'fichier' => 'bail|required'
            ]);

            $filename = trim($request->titre) . '-' . trim($request->auteur) . '.pdf';
            $filename = str_replace(' ', '_', $filename);
            $filename = str_replace('\'', '_', $filename);
            $filename = str_replace('+', '', $filename);
            $filename = str_replace('é', 'e', $filename);
            $filename = str_replace('è', 'e', $filename);
            $filename = str_replace('É', 'E', $filename);
            $filename = str_replace('È', 'E', $filename);
            $filename = str_replace('ê', 'e', $filename);
            $filename = str_replace('à', 'a', $filename);
            $filename = str_replace('ç', 'c', $filename);
            $filename = str_replace('Ç', 'C', $filename);
            $filename = str_replace('ï', 'i', $filename);
            $filename = str_replace('î', 'i', $filename);

            $book = new Book;
            $book->titre = $request->titre;
            $book->auteur = $request->auteur;
            $book->edition = $request->edition;
            $book->ISBN = $request->ISBN;
            $book->etat = ($request->hidden == "1") ? 1 : 0;
            $book->description = $request->description;
            $book->fichier = '/storage/' . $request->fichier->storeAs(config('livres.path'), $filename, 'public');

            $book->save();
            $book->disciplines()->attach($request->discipline);
            if ($request->hidden == 0) {
                $user = unserialize(Session::get('BOOKCASE_USER'));
                $notification = new Notification;
                $notification->nom_livre = $request->titre . ' de ' . $request->auteur;
                $notification->ISBN = $request->ISBN;
                $notification->valider = 0;
                $notification->nom_user = $user->firstName . ' ' . $user->lastName;
                $notification->matricule = $user->matricule;
                $notification->save();
            }
        } catch (Exception $e) {
            return back()->with('error', 'Une erreur s\'est produite');
        }


        return ($request->hidden == "1") ? redirect()->route('add_create')->with('success', 'Enregistrement du livre effectué avec succès') :
            back()->with('success', 'Enregistrement effectué avec succès');
    }


    public function createDoc()
    {
        if (!session()->has('BOOKCASE_ADMIN'))
            return redirect()->route('admin.login');
        $matieres = Matiere::all();
        return view('admin.add_document', compact('matieres'));
    }

    public function storeDoc(Request $request)
    {
        if (!session()->has('BOOKCASE_ADMIN'))
            return redirect()->route('admin.login');
        try {
            $request->validate([
                'nom' => 'bail|required|min:3',
                'matiere' => 'bail|required',
                'fichier' => 'bail|required'
            ]);
            $filename = trim($request->nom) . '.pdf';
            $filename = str_replace(' ', '_', $filename);
            $filename = str_replace('\'', '_', $filename);
            $filename = str_replace('+', '', $filename);
            $filename = str_replace('é', 'e', $filename);
            $filename = str_replace('è', 'e', $filename);
            $filename = str_replace('É', 'E', $filename);
            $filename = str_replace('È', 'E', $filename);
            $filename = str_replace('ê', 'e', $filename);
            $filename = str_replace('à', 'a', $filename);
            $filename = str_replace('ç', 'c', $filename);
            $filename = str_replace('Ç', 'C', $filename);
            $filename = str_replace('ï', 'i', $filename);
            $filename = str_replace('î', 'i', $filename);
        } catch (Exception $e) {
            return back()->with('error', 'Une erreur s\'est produite');
        }
        $document = new Documentation;
        $document->nom = $request->nom;
        $document->fichier = '/storage/' . $request->fichier->storeAs(config('livres.path2'), $filename, 'public');
        $document->save();
        $document->matieres()->attach($request->matiere);
        return back()->with('success', 'Enregistrement effectué avec succès');
    }

    public function valid_store_user($id)
    {
        if (!session()->has('BOOKCASE_ADMIN'))
            return redirect()->route('admin.login');

        $book = Book::where('id', $id)->update(['etat' => 1]);
        $livre = Book::where('id', $id)->first();
        $notification = Notification::where('ISBN', $livre->ISBN)->update(['valider' => 1]);
        $books = Book::where('etat', 0)->get();
        return view('admin.attente', compact('books'))->with('success', 'Livre enrégistré avec succès');
    }

    public function delete(Request $request)
    {
        if (!session()->has('BOOKCASE_ADMIN'))
            return redirect()->route('admin.login');

        try {
            $livre = Book::where('ISBN', $request->ISBN)->first();
            if ($livre === null) {
                return redirect()->route('all.books')->with('error', 'Aucun livre correspondant dans notre base de données');
            } else {
                $livre->delete();
                return redirect()->route('all.books')->with('success', 'Le livre a bien été placé dans le corbeille');
            }
        } catch (Exception $e) {
            return redirect()->route('all.books')->with('error', 'Une erreur s\'est produite...');
        }
    }

    public function deleteDoc(Request $request)
    {
        if (!session()->has('BOOKCASE_ADMIN'))
            return redirect()->route('admin.login');

        try {
            $livre = Documentation::where('nom', $request->nom)->first();
            if ($livre === null) {
                return redirect()->route('cons.doc')->with('error', 'Aucun livre correspondant dans notre base de données');
            } else {
                $livre->delete();
                return redirect()->route('cons.doc')->with('success', 'Le livre a bien été placé dans le corbeille');
            }
        } catch (Exception $e) {
            return redirect()->route('cons.doc')->with('error', 'Une erreur s\'est produite...');
        }
    }

    public function forceDestroy(Request $request)
    {
        if (!session()->has('BOOKCASE_ADMIN'))
            return redirect()->route('admin.login');

        try {
            $livre = Book::withTrashed()->where([
                ['ISBN', $request->ISBN],
            ])->first();
            if ($livre === null) {
                return redirect()->route('supp_create')->with('error', 'Aucun livre correspondant dans notre base de données');
            } else {
                unlink(public_path($livre->fichier));
                $livre->forceDelete();
                return redirect()->route('supp_create')->with('success', 'Le livre a bien été definitivement supprimé');
            }
        } catch (Exception $e) {
            return redirect()->route('supp_create')->with('error', 'Une erreur est produite...');
        }
    }

    public function forceDestroyDoc(Request $request)
    {
        if (!session()->has('BOOKCASE_ADMIN'))
            return redirect()->route('admin.login');

        try {
            $livre = Documentation::withTrashed()->where([
                ['nom', $request->nom],
            ])->first();
            if ($livre === null) {
                return redirect()->route('supp.document')->with('error', 'Aucun livre correspondant dans notre base de données');
            } else {
                unlink(public_path($livre->fichier));
                $livre->forceDelete();
                return redirect()->route('supp.document')->with('success', 'Le livre a bien été definitivement supprimé');
            }
        } catch (Exception $e) {
            return redirect()->route('supp.document')->with('error', 'Une erreur est produite...');
        }
    }

    public function restore(Request $request)
    {
        if (!session()->has('BOOKCASE_ADMIN'))
            return redirect()->route('admin.login');

        try {
            $livre = Book::withTrashed()->where([
                ['ISBN', $request->ISBN],
            ])->first();
            if ($livre === null) {
                return redirect()->route('supp_create')->with('error', 'Aucun livre correspondant dans notre base de données');
            } else {
                $livre->restore();
                return redirect()->route('supp_create')->with('success', 'Le livre a bien été restoré');
            }
        } catch (Exception $e) {
            return redirect()->route('supp_create')->with('error', 'Une erreur est produite...');
        }
    }

    public function restoreDoc(Request $request)
    {
        if (!session()->has('BOOKCASE_ADMIN'))
            return redirect()->route('admin.login');

        try {
            $livre = Documentation::withTrashed()->where('nom', $request->nom)->first();
            if ($livre === null) {
                return redirect()->route('supp.document')->with('error', 'Aucun livre correspondant dans notre base de données');
            } else {
                $livre->restore();
                return redirect()->route('supp.document')->with('success', 'Le livre a bien été restoré');
            }
        } catch (Exception $e) {
            return redirect()->route('supp.document')->with('error', 'Une erreur est produite...');
        }
    }
}
