from rest_framework import serializers
from .models import (
    Course, CourseEligibility, CourseFee, FeeDetail, HostelFee,
    Semester, Subject, CareerProspect,
    Recruiter, WhyJoin, CourseHighlight, CourseImage, Testimonial
)
from colleges.models import College


class CourseEligibilitySerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseEligibility
        exclude = ['id', 'course']


class FeeDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = FeeDetail
        exclude = ['id', 'course_fee']


class CourseFeeSerializer(serializers.ModelSerializer):
    details = FeeDetailSerializer(many=True, read_only=True)
    
    class Meta:
        model = CourseFee
        exclude = ['id', 'course']


class HostelFeeSerializer(serializers.ModelSerializer):
    class Meta:
        model = HostelFee
        exclude = ['id', 'course']


class SubjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subject
        exclude = ['id', 'semester']


class SemesterSerializer(serializers.ModelSerializer):
    subjects = SubjectSerializer(many=True, read_only=True)
    
    class Meta:
        model = Semester
        exclude = ['id', 'course']


class CareerProspectSerializer(serializers.ModelSerializer):
    class Meta:
        model = CareerProspect
        exclude = ['id', 'course']




class RecruiterSerializer(serializers.ModelSerializer):
    class Meta:
        model = Recruiter
        exclude = ['id', 'course']


class WhyJoinSerializer(serializers.ModelSerializer):
    class Meta:
        model = WhyJoin
        exclude = ['id', 'course']


class CourseHighlightSerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseHighlight
        exclude = ['id', 'course']


class CourseImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseImage
        exclude = ['id', 'course']


class TestimonialSerializer(serializers.ModelSerializer):
    class Meta:
        model = Testimonial
        exclude = ['id', 'course']


class CourseDetailSerializer(serializers.ModelSerializer):
    eligibility = CourseEligibilitySerializer(read_only=True)
    fees = CourseFeeSerializer(read_only=True)
    hostel_fee = HostelFeeSerializer(read_only=True)
    semesters = SemesterSerializer(many=True, read_only=True)
    career_prospects = CareerProspectSerializer(many=True, read_only=True)
    # admission_steps and direct_admission removed
    recruiters = RecruiterSerializer(many=True, read_only=True)
    why_join = WhyJoinSerializer(many=True, read_only=True)
    highlights = CourseHighlightSerializer(many=True, read_only=True)
    images = CourseImageSerializer(many=True, read_only=True)
    testimonials = TestimonialSerializer(many=True, read_only=True)
    
    class Meta:
        model = Course
        fields = [
            'id', 'title', 'slug', 'short_description', 'overview', 'duration', 
            'category', 'banner_image', 'created_at', 'updated_at', 'eligibility', 
            'fees', 'hostel_fee', 'semesters', 'career_prospects', 'recruiters', 'why_join', 'highlights', 'images', 
            'testimonials'
        ]


# POST API Serializers for creating course data
class CourseEligibilityCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseEligibility
        fields = ['academic_qualification', 'minimum_marks', 'entrance_exam']


class FeeDetailCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = FeeDetail
        fields = ['fee_head', 'first_year', 'second_year', 'third_year', 'fourth_year', 'is_one_time']


class CourseFeeCreateSerializer(serializers.ModelSerializer):
    details = FeeDetailCreateSerializer(many=True, required=False)
    
    class Meta:
        model = CourseFee
        fields = ['domestic', 'international', 'details']


class HostelFeeCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = HostelFee
        fields = ['fee_per_year', 'ac_room_additional', 'security_deposit', 'notes']


class SubjectCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subject
        fields = ['code', 'name', 'credits', 'description']


class SemesterCreateSerializer(serializers.ModelSerializer):
    subjects = SubjectCreateSerializer(many=True, required=False)
    
    class Meta:
        model = Semester
        fields = ['name', 'number', 'subjects']


class CareerProspectCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = CareerProspect
        fields = ['title', 'salary_range', 'description']


class RecruiterCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Recruiter
        fields = ['name', 'logo']


class WhyJoinCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = WhyJoin
        fields = ['title', 'description']


class CourseHighlightCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseHighlight
        fields = ['title', 'description', 'icon']


class CourseImageCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseImage
        fields = ['image', 'title', 'is_banner']


class TestimonialCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Testimonial
        fields = ['name', 'position', 'company', 'content', 'photo']


class CourseCreateSerializer(serializers.ModelSerializer):
    """Comprehensive serializer for creating a complete course with all related data"""
    
    # Nested serializers for related objects
    eligibility = CourseEligibilityCreateSerializer(required=False)
    fees = CourseFeeCreateSerializer(required=False)
    hostel_fee = HostelFeeCreateSerializer(required=False)
    semesters = SemesterCreateSerializer(many=True, required=False)
    career_prospects = CareerProspectCreateSerializer(many=True, required=False)
    recruiters = RecruiterCreateSerializer(many=True, required=False)
    why_join = WhyJoinCreateSerializer(many=True, required=False)
    highlights = CourseHighlightCreateSerializer(many=True, required=False)
    images = CourseImageCreateSerializer(many=True, required=False)
    testimonials = TestimonialCreateSerializer(many=True, required=False)
    
    # College field for association
    college_id = serializers.IntegerField(required=False, help_text="ID of the college offering this course")
    
    class Meta:
        model = Course
        fields = [
            'title', 'short_description', 'overview', 'duration', 'category', 
            'banner_image', 'college_id', 'eligibility', 'fees', 'hostel_fee', 
            'semesters', 'career_prospects', 'recruiters', 'why_join', 
            'highlights', 'images', 'testimonials'
        ]
    
    def validate_college_id(self, value):
        """Validate that the college exists"""
        if value and not College.objects.filter(id=value).exists():
            raise serializers.ValidationError("College with this ID does not exist.")
        return value
    
    def create(self, validated_data):
        """Create course with all related data"""
        # Extract nested data
        eligibility_data = validated_data.pop('eligibility', None)
        fees_data = validated_data.pop('fees', None)
        hostel_fee_data = validated_data.pop('hostel_fee', None)
        semesters_data = validated_data.pop('semesters', [])
        career_prospects_data = validated_data.pop('career_prospects', [])
        recruiters_data = validated_data.pop('recruiters', [])
        why_join_data = validated_data.pop('why_join', [])
        highlights_data = validated_data.pop('highlights', [])
        images_data = validated_data.pop('images', [])
        testimonials_data = validated_data.pop('testimonials', [])
        college_id = validated_data.pop('college_id', None)
        
        # Create the main course
        course = Course.objects.create(**validated_data)
        
        # Create eligibility
        if eligibility_data:
            CourseEligibility.objects.create(course=course, **eligibility_data)
        
        # Create fees and fee details
        if fees_data:
            fee_details_data = fees_data.pop('details', [])
            course_fee = CourseFee.objects.create(course=course, **fees_data)
            for detail_data in fee_details_data:
                FeeDetail.objects.create(course_fee=course_fee, **detail_data)
        
        # Create hostel fee
        if hostel_fee_data:
            HostelFee.objects.create(course=course, **hostel_fee_data)
        
        # Create semesters and subjects
        for semester_data in semesters_data:
            subjects_data = semester_data.pop('subjects', [])
            semester = Semester.objects.create(course=course, **semester_data)
            for subject_data in subjects_data:
                Subject.objects.create(semester=semester, **subject_data)
        
        # Create career prospects
        for prospect_data in career_prospects_data:
            CareerProspect.objects.create(course=course, **prospect_data)
        
        # Create recruiters
        for recruiter_data in recruiters_data:
            Recruiter.objects.create(course=course, **recruiter_data)
        
        # Create why join reasons
        for why_join_item in why_join_data:
            WhyJoin.objects.create(course=course, **why_join_item)
        
        # Create highlights
        for highlight_data in highlights_data:
            CourseHighlight.objects.create(course=course, **highlight_data)
        
        # Create images
        for image_data in images_data:
            CourseImage.objects.create(course=course, **image_data)
        
        # Create testimonials
        for testimonial_data in testimonials_data:
            Testimonial.objects.create(course=course, **testimonial_data)
        
        # Associate with college if college_id is provided
        if college_id:
            try:
                college = College.objects.get(id=college_id)
                # Create program association (you might need to adjust this based on your requirements)
                from colleges.models import Program, ProgramsSection
                programs_section, created = ProgramsSection.objects.get_or_create(
                    college=college,
                    defaults={
                        'title': f'{college.name} Programs',
                        'description': f'Programs offered by {college.name}',
                    }
                )
                # Determine program type based on course category or duration
                program_type = 'UG'  # Default to undergraduate
                if 'master' in course.title.lower() or 'mtech' in course.title.lower() or 'mba' in course.title.lower():
                    program_type = 'PG'
                elif 'diploma' in course.title.lower():
                    program_type = 'DP'
                
                Program.objects.create(
                    programs_section=programs_section,
                    name=course.title,
                    course=course,
                    program_type=program_type
                )
            except College.DoesNotExist:
                pass  # College validation is handled in validate_college_id
        
        return course