from rest_framework import serializers

from apps.projects.models import (
    Project,
    ProjectDocumentMeta,
    ProjectFinancialLine,
    ProjectGalleryItem,
    ProjectMilestone,
    ProjectVideo,
)


class FinancialLineSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProjectFinancialLine
        fields = ("id", "label", "value", "sort_order")


class PublicDocumentSerializer(serializers.ModelSerializer):
    type = serializers.CharField(source="file_type")

    class Meta:
        model = ProjectDocumentMeta
        fields = ("id", "name", "type")


class GallerySerializer(serializers.ModelSerializer):
    class Meta:
        model = ProjectGalleryItem
        fields = ("id", "image", "caption")


class VideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProjectVideo
        fields = ("id", "title", "note", "youtube_id")


class MilestoneSerializer(serializers.ModelSerializer):
    class Meta:
        model = ProjectMilestone
        fields = ("id", "phase", "status", "detail", "progress_percent", "due_date", "completed_at")


class ProjectWriteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = (
            "id",
            "slug",
            "name",
            "location",
            "project_type",
            "total_area",
            "building_size",
            "units",
            "expected_completion",
            "status",
            "status_label",
            "tag",
            "summary",
            "image",
            "overview",
            "location_detail",
            "master_plan",
            "architecture",
            "structural_design",
            "construction_progress",
            "safety_features",
            "investment_opportunity",
            "investor_benefits",
            "progress_percent",
            "is_published",
        )


class ProjectListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = (
            "id",
            "slug",
            "name",
            "location",
            "project_type",
            "total_area",
            "building_size",
            "units",
            "expected_completion",
            "status",
            "status_label",
            "tag",
            "summary",
            "image",
            "progress_percent",
            "is_published",
        )


class ProjectDetailSerializer(serializers.ModelSerializer):
    financial_overview = FinancialLineSerializer(source="financial_lines", many=True)
    documents = PublicDocumentSerializer(source="public_documents", many=True)
    gallery = serializers.SerializerMethodField()
    videos = VideoSerializer(many=True)
    timeline = MilestoneSerializer(source="milestones", many=True)
    investment_terms = serializers.SerializerMethodField()

    class Meta:
        model = Project
        fields = (
            "id",
            "slug",
            "name",
            "location",
            "project_type",
            "total_area",
            "building_size",
            "units",
            "expected_completion",
            "status",
            "status_label",
            "tag",
            "summary",
            "image",
            "overview",
            "location_detail",
            "master_plan",
            "architecture",
            "structural_design",
            "construction_progress",
            "safety_features",
            "investment_opportunity",
            "financial_overview",
            "investor_benefits",
            "documents",
            "gallery",
            "videos",
            "timeline",
            "progress_percent",
            "investment_terms",
        )

    def get_gallery(self, obj):
        return [item.image for item in obj.gallery_items.all()]

    def get_investment_terms(self, obj):
        terms = getattr(obj, "investment_terms", None)
        if terms is None or not terms.is_published:
            request = self.context.get("request")
            user = getattr(request, "user", None) if request else None
            staff = bool(user and getattr(user, "is_authenticated", False) and getattr(user, "role", None) in {
                "super_admin",
                "admin",
                "finance_manager",
                "project_manager",
            })
            if not staff:
                return None
        if terms is None:
            return None
        from apps.core.api_serializers import ProjectInvestmentTermsSerializer

        return ProjectInvestmentTermsSerializer(terms).data
