# extractly/serializers.py
from __future__ import annotations

from rest_framework import serializers
from extractly.models import (
    SourceHtml, SourceManual, NetworkMonitoredPage,
    AdsManual, SourceNetwork, Ads
)

# ───────────────────────── źródła ─────────────────────────
class NetworkSourceSerializer(serializers.ModelSerializer):
    class Meta:
        model = SourceNetwork
        fields = "__all__"

class HtmlNetworkSourceSerializer(serializers.ModelSerializer):
    class Meta:
        model = SourceHtml
        fields = "__all__"

class ManualDataSourceSerializer(serializers.ModelSerializer):
    class Meta:
        model = SourceManual
        fields = "__all__"

class NetworkMonitoredPageSerializer(serializers.ModelSerializer):
    class Meta:
        model = NetworkMonitoredPage
        fields = "__all__"

# ───────────────────────── Ads (baza) ─────────────────────────
# UWAGA: w Twoim pliku była zduplikowana klasa `NetworkMonitoringSerializer`.
# Zostawiam jedną, jednoznacznie nazwaną:
class AdsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ads
        fields = "__all__"

# (opcjonalnie dla wstecznej kompatybilności – alias)
NetworkMonitoringSerializer = AdsSerializer


# ───────────────────────── AdsManual (pełny) ─────────────────────────
class NetworkMonitoringManualSerializer(serializers.ModelSerializer):
    """Pełny serializer AdsManual (do wewnętrznych zastosowań)."""
    class Meta:
        model = AdsManual
        fields = "__all__"


# ───────────────────────── AdsManual → Cloud (odchudzony) ─────────────────────────
# Pola, których NIE chcemy wysyłać do chmury:
_CLOUD_DISALLOWED_FIELDS = {
    "original_image_urls",
    "advertiser_name",
    "advertiser_phone",
    "processed_without_image",
    "incomplete_data",
    "has_data",
    "check_active",
    "check_active_from_image",
    "check_active_date",
    "isSendToMainServer",
}

class AdsManualCloudSerializer(serializers.ModelSerializer):
    """
    Minimalny, bezpieczny serializer do wysyłki do chmury:
    - wycina pola techniczne/niewspierane po stronie odbiorcy (exclude)
    - opcjonalnie usuwa puste wartości w to_representation (lżejszy payload)
    """
    class Meta:
        model = AdsManual
        # zamiast fields="__all__", celowo wycinamy niepożądane klucze:
        exclude = tuple(_CLOUD_DISALLOWED_FIELDS)

    def to_representation(self, instance):
        data = super().to_representation(instance)
        # wyrzuć puste wartości, ale zachowaj 0/False
        cleaned = {k: v for k, v in data.items() if v not in (None, "", [], {})}
        return cleaned
