"""
Internal ORM-to-dict serializers shared by the banner services.

Kept as plain module-level functions (not part of either service class) so
they can be imported by both ``banner_consent_service`` and
``banner_admin_service`` without cyclic dependencies.
"""

from typing import Any

from compliance.db.banner_models import (
    BannerCategoryConfigDB,
    BannerConsentDB,
    BannerSiteConfigDB,
    BannerVendorConfigDB,
)


def consent_to_dict(c: BannerConsentDB) -> dict[str, Any]:
    return {
        "id": str(c.id),
        "site_id": c.site_id,
        "device_fingerprint": c.device_fingerprint,
        "categories": c.categories or [],
        "vendors": c.vendors or [],
        "vendor_consents": c.vendor_consents or {},
        "ip_hash": c.ip_hash,
        "user_agent": c.user_agent,
        "consent_string": c.consent_string,
        "linked_email": c.linked_email,
        "consent_method": c.consent_method,
        "banner_version": c.banner_version,
        "banner_config_hash": c.banner_config_hash,
        "geo_country": c.geo_country,
        "geo_region": c.geo_region,
        "consent_scope": c.consent_scope,
        "page_url": c.page_url,
        "referrer": c.referrer,
        "device_type": c.device_type,
        "browser": c.browser,
        "os": c.os,
        "screen_resolution": c.screen_resolution,
        "session_id": c.session_id,
        "scripts_blocked": c.scripts_blocked or [],
        "scripts_released": c.scripts_released or [],
        "cookies_set": c.cookies_set or [],
        "expires_at": c.expires_at.isoformat() if c.expires_at else None,
        "created_at": c.created_at.isoformat() if c.created_at else None,
        "updated_at": c.updated_at.isoformat() if c.updated_at else None,
    }


def site_config_to_dict(s: BannerSiteConfigDB) -> dict[str, Any]:
    return {
        "id": str(s.id),
        "site_id": s.site_id,
        "site_name": s.site_name,
        "site_url": s.site_url,
        "banner_title": s.banner_title,
        "banner_description": s.banner_description,
        "privacy_url": s.privacy_url,
        "imprint_url": s.imprint_url,
        "dsb_name": s.dsb_name,
        "dsb_email": s.dsb_email,
        "theme": s.theme or {},
        "tcf_enabled": s.tcf_enabled,
        "config_version": s.config_version,
        "is_active": s.is_active,
        "created_at": s.created_at.isoformat() if s.created_at else None,
        "updated_at": s.updated_at.isoformat() if s.updated_at else None,
    }


def category_to_dict(c: BannerCategoryConfigDB) -> dict[str, Any]:
    return {
        "id": str(c.id),
        "site_config_id": str(c.site_config_id),
        "category_key": c.category_key,
        "name_de": c.name_de,
        "name_en": c.name_en,
        "description_de": c.description_de,
        "description_en": c.description_en,
        "is_required": c.is_required,
        "sort_order": c.sort_order,
        "is_active": c.is_active,
    }


def vendor_to_dict(v: BannerVendorConfigDB) -> dict[str, Any]:
    return {
        "id": str(v.id),
        "site_config_id": str(v.site_config_id),
        "vendor_name": v.vendor_name,
        "vendor_url": v.vendor_url,
        "category_key": v.category_key,
        "description_de": v.description_de,
        "description_en": v.description_en,
        "cookie_names": v.cookie_names or [],
        "retention_days": v.retention_days,
        "is_active": v.is_active,
    }
