import sys
import os
import uuid
from dotenv import load_dotenv
load_dotenv()
from sqlalchemy.orm import Session
from app.database import SessionLocal, engine
from app.models.plant import Plant, VarietyType
from app.models.graft_combination import GraftCombination
from app.models.soil_profile import SoilProfile
from app.seeds.enrich import generate_graft_combinations, NOW

def resume_grafts():
    db = SessionLocal()
    try:
        # 1. Load existing plants from DB
        scions = db.query(Plant).filter(Plant.variety_type == VarietyType.scion).all()
        rootstocks = db.query(Plant).filter(Plant.variety_type == VarietyType.rootstock).all()
        
        if not scions or not rootstocks:
            print("Error: No plants found in database. Please run the full seed first.")
            return

        print(f"Resuming Graft Generation:")
        print(f" - Loaded {len(scions)} scions from database")
        print(f" - Loaded {len(rootstocks)} rootstocks from database")
        print("-" * 40)

        # 2. Clear only existing grafts to avoid duplicates
        print("Clearing old graft combinations...")
        db.query(GraftCombination).delete()
        db.commit()

        # 3. Generate + commit graft combinations
        print("[5/5] Generating and saving graft combinations (Small Batches)...")
        plant_id_set = {str(p.id) for p in scions + rootstocks}
        
        try:
            graft_dicts = generate_graft_combinations(scions, rootstocks)
            inserted_grafts = 0
            for g in graft_dicts:
                rs_id = str(g.get("rootstock_id", ""))
                sc_id = str(g.get("scion_id", ""))
                
                if rs_id not in plant_id_set or sc_id not in plant_id_set:
                    continue
                    
                db.add(GraftCombination(
                    id=uuid.uuid4(),
                    rootstock_id=uuid.UUID(rs_id),
                    scion_id=uuid.UUID(sc_id),
                    compatibility_score=float(g.get("compatibility_score", 0.8)),
                    vigor_boost=float(g.get("vigor_boost", 1.1)),
                    yield_modifier=float(g.get("yield_modifier", 1.1)),
                    stress_tolerance_override=g.get("stress_tolerance_override") or {},
                    notes=str(g.get("notes", "")),
                    source_reference=str(g.get("source_reference", "")),
                    created_at=NOW,
                    updated_at=NOW,
                ))
                inserted_grafts += 1
            
            db.commit()
            print(f"\nSuccess! Saved {inserted_grafts} graft combinations ✓")
            print("Database enrichment is now 100% complete.")
            
        except Exception as e:
            db.rollback()
            print(f"\nGraft generation failed — {e}")
            
    finally:
        db.close()

if __name__ == "__main__":
    resume_grafts()
