from rest_framework import serializers
from .models import Company, Organization, Department, Director


class CompanySerializer(serializers.ModelSerializer):
    """Serializer for Company model."""
    created_by_name = serializers.SerializerMethodField()
    logo_url = serializers.SerializerMethodField()

    class Meta:
        model = Company
        fields = [
            "id", "name", "abbreviation", "slug", "legal_name", "company_type", "donor_category",
            "industry",
            "website", "email", "phone", "address", "city", "country", "tax_id",
            "pic", "pic_title",
            "logo", "logo_url", "description", "notes", "tags", "created_by",
            "created_by_name", "created_at", "updated_at"
        ]
        read_only_fields = ["id", "logo_url", "created_at", "updated_at"]

    def get_created_by_name(self, obj):
        if obj.created_by:
            return obj.created_by.get_full_name() or obj.created_by.username
        return None

    def get_logo_url(self, obj):
        if not obj.logo:
            return None
        request = self.context.get("request")
        url = obj.logo.url
        return request.build_absolute_uri(url) if request else url


def _image_url(obj, field_name, request):
    field = getattr(obj, field_name)
    if not field:
        return None
    return request.build_absolute_uri(field.url) if request else field.url


class OrgProfileSerializer(serializers.ModelSerializer):
    """Serializer for the organization profile singleton."""
    logo_url = serializers.SerializerMethodField()
    logo_white_url = serializers.SerializerMethodField()
    logo_full_url = serializers.SerializerMethodField()
    logo_full_white_url = serializers.SerializerMethodField()
    favicon_url = serializers.SerializerMethodField()
    primary_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    primary_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    secondary_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    secondary_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    accent_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    accent_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    font_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    font_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    link_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    link_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    sidebar_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    sidebar_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    sidebar_font_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    sidebar_font_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    icon_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    icon_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    sidebar_active_bg_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    sidebar_active_bg_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    sidebar_active_icon_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    sidebar_active_icon_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    tab_active_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    tab_active_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    button_color_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    button_color_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    chart_color_1_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    chart_color_1_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    chart_color_2_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    chart_color_2_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    chart_color_3_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    chart_color_3_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    chart_color_4_light = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)
    chart_color_4_dark = serializers.CharField(max_length=7, required=False, allow_null=True, allow_blank=True)

    class Meta:
        model = Organization
        fields = [
            "id", "name", "legal_name", "tagline",
            "logo", "logo_url", "logo_white", "logo_white_url",
            "logo_full", "logo_full_url", "logo_full_white", "logo_full_white_url",
            "favicon", "favicon_url",
            "primary_color_light", "primary_color_dark",
            "secondary_color_light", "secondary_color_dark",
            "accent_color_light", "accent_color_dark",
            "font_color_light", "font_color_dark",
            "link_color_light", "link_color_dark",
            "sidebar_color_light", "sidebar_color_dark",
            "sidebar_font_color_light", "sidebar_font_color_dark",
            "icon_color_light", "icon_color_dark",
            "sidebar_active_bg_color_light", "sidebar_active_bg_color_dark",
            "sidebar_active_icon_color_light", "sidebar_active_icon_color_dark",
            "tab_active_color_light", "tab_active_color_dark",
            "button_color_light", "button_color_dark",
            "chart_color_1_light", "chart_color_1_dark",
            "chart_color_2_light", "chart_color_2_dark",
            "chart_color_3_light", "chart_color_3_dark",
            "chart_color_4_light", "chart_color_4_dark",
            "email", "phone", "website", "address", "city", "country",
            "latitude", "longitude",
            "tax_id", "description", "created_at", "updated_at",
        ]
        read_only_fields = [
            "id", "logo_url", "logo_white_url", "logo_full_url", "logo_full_white_url",
            "favicon_url", "created_at", "updated_at",
        ]

    def get_logo_url(self, obj):
        return _image_url(obj, "logo", self.context.get("request"))

    def get_logo_white_url(self, obj):
        return _image_url(obj, "logo_white", self.context.get("request"))

    def get_logo_full_url(self, obj):
        return _image_url(obj, "logo_full", self.context.get("request"))

    def get_logo_full_white_url(self, obj):
        return _image_url(obj, "logo_full_white", self.context.get("request"))

    def get_favicon_url(self, obj):
        return _image_url(obj, "favicon", self.context.get("request"))

    def validate_primary_color_light(self, value):
        return value or None

    def validate_primary_color_dark(self, value):
        return value or None

    def validate_secondary_color_light(self, value):
        return value or None

    def validate_secondary_color_dark(self, value):
        return value or None

    def validate_accent_color_light(self, value):
        return value or None

    def validate_accent_color_dark(self, value):
        return value or None

    def validate_font_color_light(self, value):
        return value or None

    def validate_font_color_dark(self, value):
        return value or None

    def validate_link_color_light(self, value):
        return value or None

    def validate_link_color_dark(self, value):
        return value or None

    def validate_sidebar_color_light(self, value):
        return value or None

    def validate_sidebar_color_dark(self, value):
        return value or None

    def validate_sidebar_font_color_light(self, value):
        return value or None

    def validate_sidebar_font_color_dark(self, value):
        return value or None

    def validate_icon_color_light(self, value):
        return value or None

    def validate_icon_color_dark(self, value):
        return value or None

    def validate_sidebar_active_bg_color_light(self, value):
        return value or None

    def validate_sidebar_active_bg_color_dark(self, value):
        return value or None

    def validate_sidebar_active_icon_color_light(self, value):
        return value or None

    def validate_sidebar_active_icon_color_dark(self, value):
        return value or None

    def validate_tab_active_color_light(self, value):
        return value or None

    def validate_tab_active_color_dark(self, value):
        return value or None

    def validate_button_color_light(self, value):
        return value or None

    def validate_button_color_dark(self, value):
        return value or None

    def validate_chart_color_1_light(self, value):
        return value or None

    def validate_chart_color_1_dark(self, value):
        return value or None

    def validate_chart_color_2_light(self, value):
        return value or None

    def validate_chart_color_2_dark(self, value):
        return value or None

    def validate_chart_color_3_light(self, value):
        return value or None

    def validate_chart_color_3_dark(self, value):
        return value or None

    def validate_chart_color_4_light(self, value):
        return value or None

    def validate_chart_color_4_dark(self, value):
        return value or None


class DepartmentSerializer(serializers.ModelSerializer):
    """Serializer for internal Department records."""
    head_name = serializers.SerializerMethodField()
    parent_name = serializers.SerializerMethodField()
    employee_count = serializers.SerializerMethodField()

    class Meta:
        model = Department
        fields = [
            "id", "name", "code", "description", "is_research", "parent", "parent_name",
            "head", "head_name", "employee_count", "created_at", "updated_at",
        ]
        read_only_fields = ["id", "parent_name", "head_name", "employee_count", "created_at", "updated_at"]

    def get_head_name(self, obj):
        if obj.head_id and obj.head and obj.head.user_id:
            return obj.head.user.get_full_name() or obj.head.user.username
        return None

    def get_parent_name(self, obj):
        return obj.parent.name if obj.parent_id else None

    def get_employee_count(self, obj):
        counts = self.context.get("dept_counts")
        if counts is not None:
            return counts.get(obj.name, 0)
        from apps.hr.models import Employee
        return Employee.objects.filter(department=obj.name).count()


class DirectorSerializer(serializers.ModelSerializer):
    """Serializer for Director records. Always linked to an Employee."""
    employee_name = serializers.SerializerMethodField()
    employee_email = serializers.SerializerMethodField()
    employee_phone = serializers.SerializerMethodField()
    employee_position = serializers.CharField(source="employee.position", read_only=True)
    employee_department = serializers.CharField(source="employee.department", read_only=True)
    photo_url = serializers.SerializerMethodField()

    class Meta:
        model = Director
        fields = [
            "id", "employee", "employee_name", "employee_email",
            "employee_phone", "employee_position", "employee_department",
            "photo_url", "title", "bio",
            "order", "is_active", "created_at", "updated_at",
        ]
        read_only_fields = [
            "id", "employee_name", "employee_email", "employee_phone",
            "employee_position", "employee_department", "photo_url",
            "created_at", "updated_at",
        ]

    def get_employee_name(self, obj):
        if obj.employee_id and obj.employee.user_id:
            return obj.employee.user.get_full_name() or obj.employee.user.username
        return None

    def get_employee_email(self, obj):
        return obj.employee.user.email if obj.employee_id and obj.employee.user_id else None

    def get_employee_phone(self, obj):
        return getattr(obj.employee.user, "phone", "") if obj.employee_id and obj.employee.user_id else ""

    def get_photo_url(self, obj):
        if not obj.employee_id or not obj.employee.user_id:
            return None
        contact = getattr(obj.employee.user, "contact_profile", None)
        if contact and contact.avatar:
            request = self.context.get("request")
            url = contact.avatar.url
            return request.build_absolute_uri(url) if request else url
        return None
