from rest_framework import serializers
from .models import Program, Semester, Course
import uuid


class ProgramSerializer(serializers.ModelSerializer):
    courses_input = serializers.CharField(write_only=True, required=False,
                                           help_text="Comma-separated list of courses")

    class Meta:
        model = Program
        fields = "__all__"
        read_only_fields = ["id", "views", "created_at", "updated_at", "created_by", "deleted_by"]

    def validate(self, data):
        if "courses_input" in data:
            raw = data.pop("courses_input")
            data["courses"] = [c.strip() for c in raw.split(",") if c.strip()]
        return data

    def create(self, validated_data):
        code = validated_data.get('code', '')
        if not code:
            validated_data['code'] = f"PROG-{uuid.uuid4().hex[:8].upper()}"
        if not validated_data.get("slug"):
            validated_data["slug"] = f"program-{uuid.uuid4().hex[:8]}"
        return super().create(validated_data)


class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = "__all__"


class SemesterSerializer(serializers.ModelSerializer):
    course_list = CourseSerializer(many=True, read_only=True)

    class Meta:
        model = Semester
        fields = "__all__"


class ProgramListSerializer(serializers.ModelSerializer):
    """Lightweight serializer for list/card views (matches your frontend programsData shape)."""

    class Meta:
        model = Program
        fields = [
            "id", "name", "abbreviation", "department", "duration",
            "description", "courses", "image_url", "level", "status", "is_featured", "icon",
        ]


class ProgramDetailSerializer(serializers.ModelSerializer):
    """Full serializer including semester-wise curriculum."""
    semesters = SemesterSerializer(many=True, read_only=True)

    class Meta:
        model = Program
        fields = "__all__"