import sys from pathlib import Path # ✅ FIX: ensure project root is first in path BEFORE imports ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT)) import random from datetime import datetime from app.db.repo import init_db, SessionLocal from app.db.models import Campaign, Recommendation from app.recs.rules import generate_recommendations CAMPAIGN_NAMES = [ "Preschool Search", "Brand Awareness", "Local Leads", "Early Education Ads", "Enrollment Push" ] # ------------------------- # Campaign generation # ------------------------- def generate_campaigns(session): campaigns = [] for i, name in enumerate(CAMPAIGN_NAMES): campaign = Campaign( google_campaign_id=f"gc_{1000+i}", name=name, budget=random.randint(50, 200), spend=0, clicks=0, impressions=0, ctr=0.0, leads=0, cpl=0.0, last_synced=datetime.utcnow() ) session.add(campaign) campaigns.append(campaign) session.commit() return campaigns # ------------------------- # Metrics simulation # ------------------------- def simulate_metrics(session, campaigns): for campaign in campaigns: spend = 0 clicks = 0 impressions = 0 leads = 0 for _ in range(30): daily_impressions = random.randint(50, 500) daily_clicks = int(daily_impressions * random.uniform(0.01, 0.1)) daily_spend = daily_clicks * random.uniform(0.5, 3.0) daily_leads = int(daily_clicks * random.uniform(0.05, 0.3)) impressions += daily_impressions clicks += daily_clicks spend += daily_spend leads += daily_leads ctr = clicks / impressions if impressions else 0 cpl = spend / leads if leads else 0 campaign.spend = round(spend, 2) campaign.clicks = clicks campaign.impressions = impressions campaign.leads = leads campaign.ctr = round(ctr, 4) campaign.cpl = round(cpl, 2) campaign.last_synced = datetime.utcnow() session.commit() # ------------------------- # Recommendations via rule engine # ------------------------- def seed_recommendations(session, campaigns): # ✅ prevent duplicate entries on re-run session.query(Recommendation).delete() session.commit() metrics = [ { "campaign_id": c.id, "cpl": c.cpl, "ctr": c.ctr, } for c in campaigns ] recs = generate_recommendations(metrics) for r in recs: session.add(Recommendation( campaign_id=r["campaign_id"], recommendation_type=r["type"], action=r["action"], reason=r["reason"], status="Pending", created_at=datetime.utcnow() )) session.commit() # ------------------------- # Main pipeline # ------------------------- def main(): print("Initializing DB...") init_db() session = SessionLocal() try: print("Seeding campaigns...") campaigns = generate_campaigns(session) print("Simulating metrics...") simulate_metrics(session, campaigns) print("Generating recommendations...") seed_recommendations(session, campaigns) print("✅ Demo database seeded successfully!") finally: session.close() if __name__ == "__main__": main()