"""Shared dataclasses representing records as they flow through the pipeline.

Naming convention:
  - `newspaper_*`  — paid newspaper subscription (Stripe-derived)
  - `newsletter_*` — free email newsletter signup (Mailchimp-derived)
  - `lead`         — Facebook Lead Ad submission (top of funnel)

Source-layer dataclasses (FacebookLead, MailchimpMember, StripeCustomer) keep
their platform's native field names. The unified `Person` and `CampaignRollup`
records use the domain-layer naming above.
"""

from dataclasses import dataclass, field
from datetime import datetime
from typing import Any, Optional


@dataclass
class FacebookLead:
    """A Facebook Lead Ad submission. In domain terms: a lead."""

    email: str
    created_at: datetime
    campaign_id: Optional[str]
    campaign_name: Optional[str]
    ad_id: Optional[str]
    raw: dict[str, Any] = field(default_factory=dict)


@dataclass
class MailchimpMember:
    """A Mailchimp audience member. In domain terms: a newsletter subscriber."""

    email: str
    subscribed_at: datetime
    audience_id: str
    status: str
    source: Optional[str] = None
    raw: dict[str, Any] = field(default_factory=dict)


@dataclass
class StripeCustomer:
    """A Stripe customer. In domain terms: a newspaper subscriber if first_paid_at is set."""

    email: str
    customer_id: str
    customer_created_at: datetime
    first_paid_at: Optional[datetime]
    subscription_status: Optional[str]
    deal_started_at: Optional[datetime] = None
    deal_status: Optional[str] = None
    deal_trial_end: Optional[datetime] = None
    raw: dict[str, Any] = field(default_factory=dict)


@dataclass
class Person:
    """Stitched identity across all three sources, keyed by normalized email."""

    email: str
    first_touch_at: Optional[datetime]
    first_touch_source: str
    facebook_lead_at: Optional[datetime] = None
    facebook_campaign_id: Optional[str] = None
    facebook_campaign_name: Optional[str] = None
    newsletter_subscribed_at: Optional[datetime] = None
    stripe_customer_created_at: Optional[datetime] = None
    newspaper_subscribed_at: Optional[datetime] = None
    newspaper_subscription_status: Optional[str] = None
    days_to_newsletter: Optional[float] = None
    days_to_newspaper: Optional[float] = None
    deal_started_at: Optional[datetime] = None
    deal_status: Optional[str] = None
    deal_trial_end: Optional[datetime] = None
    deal_outcome: Optional[str] = None


@dataclass
class CampaignRollup:
    campaign_id: str
    campaign_name: str
    spend_usd: float
    leads_count: int
    newsletter_subscribers: int
    newspaper_subscribers: int
    cost_per_lead: Optional[float]
    cost_per_newsletter_subscriber: Optional[float]
    cost_per_newspaper_subscriber: Optional[float]


@dataclass
class GA4ConversionRow:
    """One row of the GA4 conversion breakdown: eventName x source x medium x campaign."""

    event_name: str
    source: str
    medium: str
    campaign: str
    event_count: int
    conversions: float
    sessions: int
