"""Cleaning and standardization for raw source records."""

from datetime import datetime
from zoneinfo import ZoneInfo

from models import FacebookLead, MailchimpMember, StripeCustomer

UTC = ZoneInfo("UTC")


def normalize_email(email: str) -> str:
    return email.strip().lower()


def parse_iso_utc(value: str | int | float) -> datetime:
    """Parse an ISO 8601 string or unix timestamp into a UTC-aware datetime."""
    if isinstance(value, (int, float)):
        return datetime.fromtimestamp(value, tz=UTC)
    return datetime.fromisoformat(value.replace("Z", "+00:00")).astimezone(UTC)


def facebook_lead(raw: dict) -> FacebookLead:
    return FacebookLead(
        email=normalize_email(raw["email"]),
        created_at=parse_iso_utc(raw["created_time"]),
        campaign_id=raw.get("campaign_id"),
        campaign_name=raw.get("campaign_name"),
        ad_id=raw.get("ad_id"),
        raw=raw,
    )


def mailchimp_member(raw: dict) -> MailchimpMember:
    return MailchimpMember(
        email=normalize_email(raw["email"]),
        subscribed_at=parse_iso_utc(raw["timestamp_signup"]),
        audience_id=raw["audience_id"],
        status=raw["status"],
        source=raw.get("source"),
        raw=raw,
    )


def stripe_customer(raw: dict) -> StripeCustomer:
    first_paid = parse_iso_utc(raw["first_paid_at"]) if raw.get("first_paid_at") else None
    deal_started_at = (
        parse_iso_utc(raw["deal_started_at"]) if raw.get("deal_started_at") else None
    )
    deal_trial_end = (
        parse_iso_utc(raw["deal_trial_end"]) if raw.get("deal_trial_end") else None
    )
    return StripeCustomer(
        email=normalize_email(raw["email"]),
        customer_id=raw["id"],
        customer_created_at=parse_iso_utc(raw["created"]),
        first_paid_at=first_paid,
        subscription_status=raw.get("subscription_status"),
        deal_started_at=deal_started_at,
        deal_status=raw.get("deal_status"),
        deal_trial_end=deal_trial_end,
        raw=raw,
    )
