from rest_framework import serializers

from .models import Work_Contract


class ContractDetailsSerializer(serializers.ModelSerializer):

    # =====================================================
    # WORK
    # =====================================================

    work_id = serializers.IntegerField(
        source='work.id',
        read_only=True
    )

    work_name = serializers.CharField(
        source='work.name',
        read_only=True
    )

    # =====================================================
    # SUB CATEGORY
    # =====================================================

    sub_category_id = serializers.IntegerField(
        source='sub_category.id',
        read_only=True
    )

    sub_category_name = serializers.CharField(
        source='sub_category.name',
        read_only=True
    )

    # =====================================================
    # USERS
    # =====================================================

    created_by = serializers.SerializerMethodField()

    created_for = serializers.SerializerMethodField()

    last_modified_by = serializers.SerializerMethodField()

    pending_with = serializers.SerializerMethodField()

    # =====================================================
    # DISPLAY FIELDS
    # =====================================================

    contract_type_display = serializers.CharField(
        source='get_contract_type_display',
        read_only=True
    )

    escrow_status_display = serializers.CharField(
        source='get_escrow_status_display',
        read_only=True
    )

    status_display = serializers.CharField(
        source='get_status_display',
        read_only=True
    )

    flow_status_display = serializers.CharField(
        source='get_flow_status_display',
        read_only=True
    )

    payment_status_display = serializers.CharField(
        source='get_payment_status_display',
        read_only=True
    )

    class Meta:

        model = Work_Contract

        fields = [

            'id',

            # WORK
            'work_id',
            'work_name',

            # SUB CATEGORY
            'sub_category_id',
            'sub_category_name',

            # USERS
            'created_by',
            'created_for',
            'last_modified_by',
            'pending_with',

            # CONTRACT
            'title',
            'description',
            'amount',

            # TYPE
            'contract_type',
            'contract_type_display',

            # ESCROW
            'escrow_amount',
            'escrow_status',
            'escrow_status_display',

            # DATES
            'start_date',
            'end_date',

            # STATUS
            'status',
            'status_display',

            'flow_status',
            'flow_status_display',

            'payment_status',
            'payment_status_display',

            # APPROVALS
            'customer_approved',
            'contractor_approved',

            # EXTRA
            'terms_conditions',
            'message',

            # TIMES
            'accepted_at',
            'created_at',
            'updated_at',
        ]

    # =====================================================
    # COMMON IMAGE METHOD
    # =====================================================

    def get_image(self, user):

        try:

            if user.image:
                return user.image.url

            return ""

        except Exception:

            return ""

    # =====================================================
    # CREATED BY
    # =====================================================

    def get_created_by(self, obj):

        return {

            "id": obj.created_by.id,

            "name": obj.created_by.name,

            "image": self.get_image(obj.created_by)
        }

    # =====================================================
    # CREATED FOR
    # =====================================================

    def get_created_for(self, obj):

        return {

            "id": obj.created_for.id,

            "name": obj.created_for.name,

            "image": self.get_image(obj.created_for)
        }

    # =====================================================
    # LAST MODIFIED BY
    # =====================================================

    def get_last_modified_by(self, obj):

        if not obj.last_modified_by:

            return {}

        return {

            "id": obj.last_modified_by.id,

            "name": obj.last_modified_by.name,

            "image": self.get_image(obj.last_modified_by)
        }

    # =====================================================
    # PENDING WITH
    # =====================================================

    def get_pending_with(self, obj):

        if not obj.pending_with:

            return {}

        return {

            "id": obj.pending_with.id,

            "name": obj.pending_with.name,

            "image": self.get_image(obj.pending_with)
        }