"""Gestion de la bibliothèque : programme interactif
(TP bases de données et Python, question 11)

Placer ce fichier dans le même dossier que bibliotheque.db.
"""

import sqlite3

conn = sqlite3.connect("bibliotheque.db")
conn.execute("PRAGMA foreign_keys = ON")


def lire_entier(message):
    """Demande un entier à l'utilisateur jusqu'à obtenir une saisie valide."""
    while True:
        try:
            return int(input(message))
        except ValueError:
            print("Veuillez saisir un nombre entier.")


def rechercher_livre():
    debut = input("Titre (ou début de titre) : ")
    cursor = conn.execute(
        "SELECT id_livre, titre, auteur FROM Livres WHERE titre LIKE ?",
        (debut + "%",))
    resultats = cursor.fetchall()
    if resultats == []:
        print("Aucun livre trouvé.")
    for id_livre, titre, auteur in resultats:
        print(f"{id_livre} - {titre} ({auteur})")


def afficher_emprunts_en_cours():
    cursor = conn.execute("""SELECT titre, prenom, nom, date_emprunt
                             FROM Emprunts
                             JOIN Livres ON Emprunts.id_livre = Livres.id_livre
                             JOIN Eleves ON Emprunts.id_eleve = Eleves.id_eleve
                             WHERE date_retour IS NULL
                             ORDER BY date_emprunt""")
    for titre, prenom, nom, date_emprunt in cursor.fetchall():
        print(f'"{titre}" emprunté par {prenom} {nom} le {date_emprunt}')


def est_disponible(id_livre):
    """Renvoie True si aucun emprunt en cours ne concerne ce livre."""
    cursor = conn.execute(
        "SELECT COUNT(*) FROM Emprunts WHERE id_livre = ? AND date_retour IS NULL",
        (id_livre,))
    return cursor.fetchone()[0] == 0


def enregistrer_emprunt():
    id_livre = lire_entier("Identifiant du livre : ")
    id_eleve = lire_entier("Identifiant de l'élève : ")
    date = input("Date de l'emprunt (AAAA-MM-JJ) : ")
    if not est_disponible(id_livre):
        print("Ce livre est déjà emprunté.")
        return
    cursor = conn.execute("SELECT MAX(id_emprunt) FROM Emprunts")
    nouvel_id = cursor.fetchone()[0] + 1
    try:
        conn.execute("INSERT INTO Emprunts VALUES (?, ?, ?, ?, NULL)",
                     (nouvel_id, id_livre, id_eleve, date))
        conn.commit()
        print(f"Emprunt n°{nouvel_id} enregistré.")
    except sqlite3.IntegrityError as e:
        print(f"Emprunt refusé : {e}")


def enregistrer_retour():
    id_livre = lire_entier("Identifiant du livre rendu : ")
    date = input("Date du retour (AAAA-MM-JJ) : ")
    cursor = conn.execute(
        "UPDATE Emprunts SET date_retour = ? WHERE id_livre = ? AND date_retour IS NULL",
        (date, id_livre))
    conn.commit()
    if cursor.rowcount == 0:
        print("Ce livre n'était pas emprunté.")
    else:
        print("Retour enregistré.")


choix = ""
while choix != "5":
    print()
    print("=== Gestion de la bibliothèque ===")
    print("1. Rechercher un livre par titre")
    print("2. Afficher les emprunts en cours")
    print("3. Enregistrer un nouvel emprunt")
    print("4. Enregistrer un retour")
    print("5. Quitter")
    choix = input("Votre choix : ")
    if choix == "1":
        rechercher_livre()
    elif choix == "2":
        afficher_emprunts_en_cours()
    elif choix == "3":
        enregistrer_emprunt()
    elif choix == "4":
        enregistrer_retour()
    elif choix != "5":
        print("Choix inconnu.")

conn.close()
