import sqlite3
import pandas as pd

from app.models.ingredient import Ingredient
from app.models.recette import Recette

## Initialisation de la base de données SQLite
def init_db():
    # Chargement du fichier excel
    table_ingredients = pd.read_excel('data/Table_Ciqual_2025_FR_2025_11_03.xlsx', sheet_name='CIQUAL') 

    # Création de la base de données SQLite

    db_foodtool = sqlite3.connect('data/foodtool.db')

    # Enregistrement de la table dans la base de données
    table_ingredients.insert(0, "id", range(1, len(table_ingredients) + 1)) # Ajouter une colonne d'identifiant unique
    table_ingredients.to_sql('ingredients', db_foodtool, if_exists='replace', index=False)

    # Création de la table des recettes
    cursor = db_foodtool.cursor()

    # Création de la table recettes 
    cursor.execute("""
                   CREATE TABLE IF NOT EXISTS recettes ( 
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        nom TEXT NOT NULL, 
                        description TEXT)
                   """)

    cursor.execute("""
                   CREATE TABLE IF NOT EXISTS ingredients_has_recettes ( 
                        id INTEGER PRIMARY KEY AUTOINCREMENT,
                        quantite REAL,
                        unites TEXT,
                        id_ingredient INTEGER,
                        id_recette INTEGER,
                        FOREIGN KEY(id_ingredient) REFERENCES ingredients(id),
                        FOREIGN KEY(id_recette) REFERENCES recettes(id)
                        )
                   """)

    # sauvegarder les changements
    db_foodtool.commit()

    db_foodtool.close()

# Fonction pour récupérer un ingrédient depuis la base de données
def get_ingredient(nom) -> Ingredient | None :
    db_foodtool = sqlite3.connect('data/foodtool.db')
    db_foodtool.row_factory = sqlite3.Row # Permet d'accéder aux résultats par nom de colonne
    cursor = db_foodtool.cursor()
    cursor.execute("SELECT * FROM ingredients WHERE alim_nom_fr = ?", (nom,))
    # result = cursor.fetchone()
    rows = cursor.fetchall()
    
    # Convertir chaque ligne en dictionnaire
    result = [dict(row) for row in rows]

    db_foodtool.close()

    if result:
        return Ingredient(result[0])
    else:
        return None

# Fonction pour récupérer tous les ingrédients de la base de données
def get_all_ingredients():
    db_foodtool = sqlite3.connect('data/foodtool.db')
    cursor = db_foodtool.cursor()
    cursor.execute("SELECT alim_nom_fr FROM ingredients")
    
    # Convertir chaque ligne en dictionnaire
    rows = cursor.fetchall()
    result = [row[0] for row in rows]

    db_foodtool.close()

    if result:
        return result
    else:
        return None

# Fonction pour ajouter une recette à la base de données
def save_recette_to_db(recette):
    db_foodtool = sqlite3.connect('data/foodtool.db')
    cursor = db_foodtool.cursor()

    # Insérer la recette dans la table recettes
    cursor.execute("INSERT INTO recettes (nom, description) VALUES (?, ?)", (recette.get_name(), recette.get_description()))
    id_recette = cursor.lastrowid

    # Insérer les ingrédients de la recette dans la table ingredients_has_recettes
    for ingredient, quantite in recette.get_ingredients().items():
        cursor.execute("SELECT id FROM ingredients WHERE alim_nom_fr = ?", (ingredient,))
        id_ingredient = cursor.fetchone()[0]
        cursor.execute("INSERT INTO ingredients_has_recettes (quantite, unites, id_ingredient, id_recette) VALUES (?, ?, ?, ?)", (quantite, 'g', id_ingredient, id_recette))

    db_foodtool.commit()

    print(cursor.execute("SELECT * FROM recettes").fetchall())
    print(cursor.execute("SELECT * FROM ingredients_has_recettes").fetchall())

    db_foodtool.close()

# Fonction pour récupérer une recette depuis la base de données
def get_recette_from_db(nom) -> Recette | None:
    db_foodtool = sqlite3.connect('data/foodtool.db')
    cursor = db_foodtool.cursor()

    # Récupérer la recette depuis la table recettes
    cursor.execute("SELECT * FROM recettes WHERE nom = ?", (nom,))
    recette_row = cursor.fetchone()

    if recette_row:
        id_recette = recette_row[0]
        description = recette_row[2]

        # Récupérer les ingrédients de la recette depuis la table ingredients_has_recettes
        cursor.execute("SELECT i.alim_nom_fr, ir.quantite FROM ingredients_has_recettes ir JOIN ingredients i ON ir.id_ingredient = i.id WHERE ir.id_recette = ?", (id_recette,))
        ingredients_rows = cursor.fetchall()

        ingredients = {row[0]: row[1] for row in ingredients_rows}

        db_foodtool.close()

        return Recette(nom, ingredients, description)
    else:
        db_foodtool.close()
        return None

# init_db()
# ingredients = get_all_ingredients()
# print(ingredients)
# ingredient = get_ingredient(ingredients[0])
# print(ingredient)