from datetime import date
from sqlmodel import Session, select
from app.database import engine
import app.models  # noqa


def run_seed():
    from app.models.garden import Garden, GardenCell, Measurement
    from app.models.plant import Plant
    from app.models.planting import Planting, PlantingEvent
    from app.models.task import Task
    from app.models.tool import Tool
    from app.models.dicton import Dicton
    from app.models.astuce import Astuce

    with Session(engine) as session:
        already_seeded = session.exec(select(Garden)).first() is not None

        if not already_seeded:
            # ── Jardin ────────────────────────────────────────────────────────────
            jardin = Garden(
                nom="Mon potager",
                description="Potager principal plein sud",
                type="plein_air",
                exposition="S",
                ombre="plein_soleil",
                sol_type="limoneux",
                surface_m2=24.0,
                grille_largeur=6,
                grille_hauteur=4,
            )
            session.add(jardin)
            session.flush()

            for row in range(4):
                for col in range(6):
                    session.add(
                        GardenCell(
                            garden_id=jardin.id,
                            col=col,
                            row=row,
                            libelle=f"{chr(65 + row)}{col + 1}",
                        )
                    )

            session.add(Measurement(garden_id=jardin.id, temp_air=18.0, humidite_air=65.0))

            # ── 20 Plantes ────────────────────────────────────────────────────────
            plantes_data = [
                dict(nom_commun="Tomate", variete="Andine Cornue", famille="Solanacées",
                     categorie="potager", type_plante="legume", besoin_eau="fort",
                     espacement_cm=60, plantation_mois="4,5", recolte_mois="7,8,9",
                     semis_interieur_mois="2,3"),
                dict(nom_commun="Courgette", variete="Verte", famille="Cucurbitacées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=80, plantation_mois="5,6", recolte_mois="7,8",
                     semis_interieur_mois="4"),
                dict(nom_commun="Carotte", famille="Apiacées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=8, semis_exterieur_mois="3,4,5,6",
                     recolte_mois="6,7,8,9,10"),
                dict(nom_commun="Laitue", variete="Batavia", famille="Astéracées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=25, plantation_mois="3,4,5,8,9",
                     recolte_mois="5,6,7,10"),
                dict(nom_commun="Ail", famille="Amaryllidacées",
                     categorie="potager", type_plante="legume", besoin_eau="faible",
                     espacement_cm=15, plantation_mois="10,11",
                     recolte_mois="6,7"),
                dict(nom_commun="Oignon", famille="Amaryllidacées",
                     categorie="potager", type_plante="legume", besoin_eau="faible",
                     espacement_cm=10, semis_interieur_mois="2,3",
                     plantation_mois="4,5", recolte_mois="7,8"),
                dict(nom_commun="Haricot", variete="Nain", famille="Fabacées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=15, semis_exterieur_mois="5,6",
                     recolte_mois="7,8,9"),
                dict(nom_commun="Pois", variete="Mange-tout", famille="Fabacées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=10, semis_exterieur_mois="3,4",
                     recolte_mois="6,7"),
                dict(nom_commun="Poireau", famille="Amaryllidacées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=15, semis_interieur_mois="2,3",
                     plantation_mois="6,7", recolte_mois="10,11,12,1,2"),
                dict(nom_commun="Pomme de terre", famille="Solanacées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=35, plantation_mois="3,4,5",
                     recolte_mois="7,8,9,10"),
                dict(nom_commun="Fraise", famille="Rosacées",
                     categorie="potager", type_plante="fruit", besoin_eau="moyen",
                     espacement_cm=30, plantation_mois="3,4,9,10",
                     recolte_mois="5,6,7"),
                dict(nom_commun="Framboise", famille="Rosacées",
                     categorie="arbuste", type_plante="fruit", besoin_eau="moyen",
                     espacement_cm=60, plantation_mois="11,12,2,3",
                     recolte_mois="7,8,9"),
                dict(nom_commun="Persil", famille="Apiacées",
                     categorie="potager", type_plante="aromatique", besoin_eau="moyen",
                     espacement_cm=20, semis_exterieur_mois="3,4,5,8",
                     recolte_mois="4,5,6,7,8,9,10"),
                dict(nom_commun="Échalote", famille="Amaryllidacées",
                     categorie="potager", type_plante="legume", besoin_eau="faible",
                     espacement_cm=15, plantation_mois="2,3",
                     recolte_mois="7,8"),
                dict(nom_commun="Chou-fleur", famille="Brassicacées",
                     categorie="potager", type_plante="legume", besoin_eau="fort",
                     espacement_cm=60, semis_interieur_mois="3,4",
                     plantation_mois="5,6", recolte_mois="9,10,11"),
                dict(nom_commun="Chou", variete="Milan", famille="Brassicacées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=50, semis_interieur_mois="3,4",
                     plantation_mois="5,6", recolte_mois="10,11,12"),
                dict(nom_commun="Betterave", famille="Amaranthacées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=15, semis_exterieur_mois="4,5,6",
                     recolte_mois="8,9,10"),
                dict(nom_commun="Radis", famille="Brassicacées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=5, semis_exterieur_mois="3,4,5,8,9",
                     recolte_mois="4,5,6,9,10"),
                dict(nom_commun="Épinard", famille="Amaranthacées",
                     categorie="potager", type_plante="legume", besoin_eau="moyen",
                     espacement_cm=15, semis_exterieur_mois="3,4,8,9",
                     recolte_mois="5,6,10,11"),
                dict(nom_commun="Basilic", famille="Lamiacées",
                     categorie="potager", type_plante="aromatique", besoin_eau="moyen",
                     espacement_cm=20, semis_interieur_mois="3,4",
                     plantation_mois="5,6", recolte_mois="6,7,8,9"),
            ]

            plantes = []
            for data in plantes_data:
                p = Plant(**data)
                session.add(p)
                plantes.append(p)
            session.flush()

            tomate = plantes[0]
            courgette = plantes[1]

            # ── Plantings ──────────────────────────────────────────────────────────
            p1 = Planting(
                garden_id=jardin.id,
                variety_id=tomate.id,
                date_plantation=date(2026, 5, 1),
                quantite=6,
                statut="en_cours",
            )
            p2 = Planting(
                garden_id=jardin.id,
                variety_id=courgette.id,
                date_plantation=date(2026, 5, 15),
                quantite=3,
                statut="prevu",
            )
            session.add_all([p1, p2])
            session.flush()
            session.add(PlantingEvent(planting_id=p1.id, type="arrosage", note="Arrosage du matin"))

            # ── Tâches ────────────────────────────────────────────────────────────
            session.add(Task(titre="Arroser les tomates", priorite="haute",
                             statut="a_faire", garden_id=jardin.id))
            session.add(Task(titre="Traiter contre les pucerons", priorite="normale", statut="a_faire"))
            session.add(Task(titre="Préparer le compost", priorite="basse", statut="en_cours"))

        # ── Outils (indépendant du jardin) ────────────────────────────────────────
        if not session.exec(select(Tool)).first():
            outils_data = [
                dict(nom="Bêche", categorie="beche",
                     description="Bêche acier forgé, manche bois 110 cm"),
                dict(nom="Fourche-bêche", categorie="fourche",
                     description="Fourche à bêcher 4 dents inox"),
                dict(nom="Grelinette", categorie="fourche",
                     description="Aérateur bi-fourche ergonomique"),
                dict(nom="Pioche", categorie="beche",
                     description="Pioche légère pour travaux de surface"),
                dict(nom="Sarcloir", categorie="griffe",
                     description="Sarcloir oscillant pour désherber entre les rangs"),
                dict(nom="Râteau", categorie="griffe",
                     description="Râteau métallique 14 dents"),
                dict(nom="Binette", categorie="griffe",
                     description="Binette pour ameublir et désherber"),
                dict(nom="Transplantoir", categorie="taille",
                     description="Transplantoir inox gradué"),
                dict(nom="Arrosoir", categorie="arrosage",
                     description="Arrosoir 10L avec pomme amovible"),
                dict(nom="Sécateur", categorie="taille",
                     description="Sécateur de précision bypass"),
            ]
            for data in outils_data:
                session.add(Tool(**data))

        # ── Dictons (indépendant du jardin) ──────────────────────────────────────
        if not session.exec(select(Dicton)).first():
            dictons_data = [
                dict(mois=1, texte="En janvier, la neige au potager réjouit le jardinier.", region="National"),
                dict(mois=2, texte="À la Chandeleur, l'hiver reste ou reprend vigueur.", region="National"),
                dict(mois=3, texte="Mars venteux, avril pluvieux, font mai fleureux.", region="National"),
                dict(mois=3, texte="Quand mars se déguise en été, avril se déguise en hiver.", region="Auvergne"),
                dict(mois=4, texte="Avril ne te découvre pas d'un fil.", region="National"),
                dict(mois=4, texte="Pluie d'avril, fleurs à l'infini.", region="Haute-Loire"),
                dict(mois=5, texte="Gelées de mai, misère chez le jardinier.", region="Haute-Loire"),
                dict(mois=5, jour=11, texte="Saints de glace : Mamert, Pancrace et Gervais.", region="National"),
                dict(mois=6, texte="Juin sec, juillet pluvieux ; juillet sec, grains savoureux.", region="Auvergne"),
                dict(mois=7, texte="Pluie de juillet remplit greniers et cuves.", region="National"),
                dict(mois=8, texte="Août chaud, vin bon.", region="Auvergne"),
                dict(mois=9, texte="En septembre, qui sème du blé en fait son profit.", region="National"),
                dict(mois=10, texte="En octobre, glands à foison, bon hiver selon la raison.", region="Haute-Loire"),
                dict(mois=11, texte="À la Saint-Martin, bois ton vin.", region="National"),
                dict(mois=12, texte="Noël au balcon, Pâques aux tisons.", region="Auvergne"),
            ]
            for data in dictons_data:
                session.add(Dicton(**data))

        # ── Astuces (indépendant du jardin) ──────────────────────────────────────
        if not session.exec(select(Astuce)).first():
            astuces_data = [
                dict(titre="Rotation des cultures", entity_type="general",
                     contenu="Changez chaque année la famille de légumes sur chaque parcelle pour éviter l'épuisement du sol et les maladies."),
                dict(titre="Compagnonnage tomate-basilic", entity_type="plante",
                     contenu="Plantez du basilic au pied des tomates : il éloigne les pucerons et améliore le goût des fruits."),
                dict(titre="Paillage économise l'eau", entity_type="jardin",
                     contenu="Un paillage de 5 à 10 cm (paille, BRF, tontes) réduit les arrosages de moitié et limite les mauvaises herbes."),
                dict(titre="Arrosage au pied le matin", entity_type="general",
                     contenu="Arrosez toujours au pied des plantes le matin pour éviter les maladies cryptogamiques et la brûlure des feuilles."),
                dict(titre="Purin d'ortie maison", entity_type="general",
                     contenu="Faites macérer 1 kg d'orties dans 10 L d'eau pendant 10 jours. Diluez à 10 % et arrosez le sol pour stimuler la croissance."),
                dict(titre="Buttage des pommes de terre", entity_type="plante",
                     contenu="Buttez régulièrement les pommes de terre quand les fanes atteignent 20 cm pour favoriser la tubérisation."),
                dict(titre="Semis de carottes en gel", entity_type="plante",
                     contenu="Mélangez les graines de carottes avec du sable fin pour un semis homogène et clairsemé."),
                dict(titre="Récupération d'eau de pluie", entity_type="jardin",
                     contenu="Installez une cuve de récupération d'eau de pluie : une maison avec 100 m² de toiture collecte 60 000 L/an."),
                dict(titre="Calendrier lunaire", entity_type="general",
                     contenu="Semez les légumes-feuilles en lune montante, les légumes-racines en lune descendante pour de meilleurs résultats."),
                dict(titre="Taille en vert des tomates", entity_type="plante",
                     contenu="Pincez les gourmands (tiges secondaires entre tige principale et feuille) pour concentrer l'énergie sur les fruits."),
            ]
            for data in astuces_data:
                session.add(Astuce(**data))

        session.commit()
