"""Trip progress push/in-app notification recipients."""

import logging

from accounts.models import TransporterProfile
from core.models import Shipment

logger = logging.getLogger('api')


def trip_shipper_user_id(trip) -> int | None:
    """Resolve the shipper user id for a trip from the database."""
    if not trip.shipment_id:
        return None
    return (
        Shipment.objects.filter(pk=trip.shipment_id)
        .values_list('shipper_id', flat=True)
        .first()
    )


def trip_progress_notify_user_ids(trip, actor) -> list[int]:
    """
    Individual driver acting on own trip → shipper only.
    Fleet driver (assigned_driver != transporter) → shipper + fleet owner (transporter).
    """
    recipients: list[int] = []

    shipper_id = trip_shipper_user_id(trip)
    if shipper_id:
        recipients.append(shipper_id)
    else:
        logger.warning(
            'Trip progress notify missing shipper trip_id=%s shipment_id=%s actor_id=%s',
            trip.id,
            trip.shipment_id,
            getattr(actor, 'id', None),
        )

    is_fleet_driver_actor = (
        trip.assigned_driver_id
        and actor.id == trip.assigned_driver_id
        and trip.assigned_driver_id != trip.transporter_id
    )
    if is_fleet_driver_actor and trip.transporter_id:
        recipients.append(trip.transporter_id)

    seen = set()
    unique: list[int] = []
    for uid in recipients:
        if uid and uid not in seen:
            seen.add(uid)
            unique.append(uid)
    return unique


def is_fleet_driver_account(user) -> bool:
    try:
        return user.transporter_profile.account_type == TransporterProfile.AccountType.TRANSPORTER_DRIVER
    except (TransporterProfile.DoesNotExist, AttributeError):
        return False
