"""Entry point: pull -> normalize -> stitch -> metrics -> write."""

from datetime import datetime
from zoneinfo import ZoneInfo

import yaml
from dotenv import load_dotenv

from output import html, sheets
from pipeline import metrics, normalize, stitch
from sources import facebook, ga4, mailchimp, stripe_source


def main() -> None:
    load_dotenv()
    with open("config.yaml") as f:
        config = yaml.safe_load(f)

    tz = ZoneInfo(config["timezone"])
    started_at = datetime.now(tz)

    raw_leads = facebook.fetch_leads(config)
    raw_members = mailchimp.fetch_members(config)
    raw_customers = stripe_source.fetch_customers(config)
    fb_campaigns = facebook.fetch_campaign_spend(config)
    ga4_conversions = ga4.fetch_conversion_breakdown(config)

    fb_leads = [normalize.facebook_lead(r) for r in raw_leads]
    mc_members = [normalize.mailchimp_member(r) for r in raw_members]
    stripe_customers = [normalize.stripe_customer(r) for r in raw_customers]

    people = stitch.build_people(fb_leads, mc_members, stripe_customers)
    people = metrics.compute_funnel_times(people)
    campaigns = metrics.rollup_campaigns(people, fb_campaigns)

    sheets.write_people(people, config["sheets"], tz)
    sheets.write_campaigns(campaigns, config["sheets"], tz)
    sheets.write_ga4_conversions(ga4_conversions, config["sheets"], tz)
    sheets.write_run_log(
        started_at,
        len(people),
        len(campaigns),
        len(ga4_conversions),
        config["sheets"],
        tz,
    )

    dashboard_path = html.write_dashboard(people, config, tz)
    print(f"Dashboard written to {dashboard_path}", flush=True)


if __name__ == "__main__":
    main()
