from rest_framework import serializers
from .models import JobOffer, JobApplication


class JobOfferSerializer(serializers.ModelSerializer):
    """Liste publique et détail : champs pour affichage."""
    class Meta:
        model = JobOffer
        fields = [
            "id", "title", "post", "description", "deadline",
            "image", "document", "is_active", "created_at",
        ]
        read_only_fields = ["created_at"]


class JobOfferAdminSerializer(serializers.ModelSerializer):
    """Admin : création / édition. Au moins image ou document requis."""
    class Meta:
        model = JobOffer
        fields = [
            "id", "title", "post", "description", "deadline",
            "image", "document", "is_active", "created_at", "updated_at",
        ]
        read_only_fields = ["created_at", "updated_at"]

    def validate(self, data):
        if not self.instance:
            if not data.get("image") and not data.get("document"):
                raise serializers.ValidationError(
                    "Au moins une photo ou un document PDF est obligatoire."
                )
        else:
            # Mise à jour : au moins un des deux doit rester (ou être fourni)
            final_image = data.get("image") if "image" in data else getattr(self.instance, "image", None)
            final_doc = data.get("document") if "document" in data else getattr(self.instance, "document", None)
            if not final_image and not final_doc:
                raise serializers.ValidationError(
                    "Au moins une photo ou un document PDF est obligatoire."
                )
        return data


class JobApplicationSerializer(serializers.ModelSerializer):
    """Création d'une candidature (public). CV : fichier ou URL. Lettre : texte ou PDF."""
    class Meta:
        model = JobApplication
        fields = [
            "id", "job_offer",
            "first_name", "last_name", "email", "phone", "address", "region",
            "cv_file", "cv_url", "cover_letter_text", "cover_letter_file",
            "deposit_number", "status", "created_at",
        ]
        read_only_fields = ["deposit_number", "status", "created_at"]

    def validate(self, data):
        if not data.get("cv_file") and not data.get("cv_url"):
            raise serializers.ValidationError(
                "Fournissez un CV (fichier PDF ou lien URL)."
            )
        if not data.get("cover_letter_text") and not data.get("cover_letter_file"):
            raise serializers.ValidationError(
                "Fournissez une lettre de motivation (texte ou fichier PDF)."
            )
        return data


class JobApplicationAdminSerializer(serializers.ModelSerializer):
    """Admin : liste, détail, mise à jour statut (valider / refuser)."""
    job_offer_title = serializers.CharField(source="job_offer.title", read_only=True)
    job_offer_post = serializers.CharField(source="job_offer.post", read_only=True)

    class Meta:
        model = JobApplication
        fields = [
            "id", "job_offer", "job_offer_title", "job_offer_post",
            "first_name", "last_name", "email", "phone", "address", "region",
            "cv_file", "cv_url", "cover_letter_text", "cover_letter_file",
            "deposit_number", "status", "start_date", "admin_notes", "created_at",
        ]
        read_only_fields = ["deposit_number", "created_at"]
