from django.contrib.auth import get_user_model
from rest_framework import serializers

from portfolio.models import StudentProfile
from portfolio.serializers import (
    AchievementSerializer,
    EducationSerializer,
    ExperienceSerializer,
    ProjectSerializer,
    SkillSerializer,
    StudentProfileSerializer,
)
from resume.models import GeneratedResume

User = get_user_model()


class AdminStudentListSerializer(serializers.ModelSerializer):
    first_name = serializers.SerializerMethodField()
    last_name = serializers.SerializerMethodField()
    student_group = serializers.SerializerMethodField()
    photo_url = serializers.SerializerMethodField()
    profile_id = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = (
            "id",
            "email",
            "username",
            "is_verified",
            "is_active",
            "date_joined",
            "first_name",
            "last_name",
            "student_group",
            "photo_url",
            "profile_id",
        )

    def _profile(self, obj):
        try:
            return obj.student_profile
        except StudentProfile.DoesNotExist:
            return None

    def get_first_name(self, obj):
        p = self._profile(obj)
        return p.first_name if p else (obj.first_name or "")

    def get_last_name(self, obj):
        p = self._profile(obj)
        return p.last_name if p else (obj.last_name or "")

    def get_student_group(self, obj):
        p = self._profile(obj)
        return p.student_group if p else ""

    def get_profile_id(self, obj):
        p = self._profile(obj)
        return p.id if p else None

    def get_photo_url(self, obj):
        p = self._profile(obj)
        if not p or not p.photo:
            return ""
        request = self.context.get("request")
        url = p.photo.url
        if request:
            return request.build_absolute_uri(url)
        return url


class AdminUserUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = (
            "email",
            "username",
            "is_verified",
            "is_active",
            "first_name",
            "last_name",
        )


class GeneratedResumeShortSerializer(serializers.ModelSerializer):
    template_name = serializers.CharField(
        source="template.name", read_only=True, allow_null=True
    )

    class Meta:
        model = GeneratedResume
        fields = ("id", "template_id", "template_name", "created_at", "is_public")
