from django.contrib.auth import get_user_model
from rest_framework import serializers
from users.models import *
from users.audit_log_helper import update_audit_details
from organisations.serializers import *
from datetime import datetime
import datetime as datetime_timedelta
from django.utils.timezone import make_aware
from ledgers.models import SystemTransactions
from license.models import *
import json

class StaffSerializer(serializers.ModelSerializer):
    staff_number       = serializers.CharField(required=False)
    staff_added_by     = serializers.CharField(required=False,read_only=True)
    staff_organisation = serializers.CharField(required=False,read_only=True)
    picture_url        = serializers.ImageField(required=False)
    organisation_branch = serializers.SerializerMethodField()

    class Meta:
        model = Staff
        fields = '__all__'

    def get_organisation_branch(self, obj):
        try:
            staff_organisation = obj.staff_organisation
            branch = OrganisationBranch.objects.filter(branch_organisation=staff_organisation).first()
            if branch:
                return OrganisationBranchSerializer(branch).data
            else:
                return None
        except AttributeError:
            return None

class UserSerializer(serializers.ModelSerializer):
    name  = serializers.CharField(read_only=True, source="user_staff.name")
    user_organisation_branch = serializers.CharField(required=False,read_only=True)
    password = serializers.CharField(required=False,read_only=True)
    user_organisation_branch_id = serializers.CharField(required=False,read_only=True,source="user_organisation_branch.id")
    user_staff  = serializers.CharField(required=False)
    email       = serializers.CharField(read_only=True, source="user_staff.email")
    
    class Meta:
        model = User
        fields = '__all__'


class UserAssignedRoleSerializer(serializers.ModelSerializer):
    assigned_role_added_by =  serializers.CharField(required=False,read_only=True)
    assigned_role  = serializers.CharField(read_only=True, source="assigned_role.id")
    role_name      = serializers.CharField(read_only=True, source="assigned_role.role_name")
    staff_name     = serializers.CharField(read_only=True, source="assigned_role.user.user_staff.name")
    
    class Meta:
        model = UserAssignedRole
        fields = '__all__'

class GetFullUserSerializer(serializers.ModelSerializer):
#    user_system_role = UserSystemRolesSerializer(read_only=True, many=True)
    name  = serializers.CharField(read_only=True, source="user_staff.name")
    pass_expiry_status = serializers.SerializerMethodField()
    license_details  = serializers.SerializerMethodField()

    def get_pass_expiry_status(self,obj):
        organisation = obj.user_organisation_branch
    
        pass_expiry_status   = OrganisationSetting.objects.filter(org_setting=organisation.branch_organisation,setting_key='password_expiry_status', setting_value= 'on').first()
        if pass_expiry_status:
            password_expiry_setting = OrganisationSetting.objects.filter(org_setting=organisation.branch_organisation,setting_key='password_expiry_days').first()
            if password_expiry_setting:
                password_expiry_days  = int(password_expiry_setting.setting_value)
                current_date    = make_aware(datetime.strptime(datetime.now().strftime("%Y-%m-%d"), '%Y-%m-%d'))
                pass_reset_date = make_aware(datetime.strptime(obj.pass_reset_date.strftime("%Y-%m-%d"), '%Y-%m-%d'))
                pass_reset_date = pass_reset_date + datetime_timedelta.timedelta(days=password_expiry_days)
                if pass_reset_date < current_date:
                    return True
        return False

    def get_license_details(self,obj):
        organisation = obj.user_organisation_branch.branch_organisation.id
        license_data = LicenseSubscription.objects.filter(organisation=organisation).first()
        if license_data:
            grace_period = license_data.grace_period
            license_status = license_data.status
            return {
                "grace_period":grace_period,
                "license_status":license_status
            }

    class Meta:
        model = get_user_model()
        fields = ('id','username','is_superuser','is_active','name','assigned_days','pass_expiry_status','date_joined','pin','pass_reset_date','license_details','updated_password')  

class UserPermissionsSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserPermissions
        fields = '__all__'

class ChangePasswordSerializer(serializers.Serializer):
    """
    Serializer for password change endpoint.
    """
    old_password = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)


class AuditTransactionsSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    credit_chart = serializers.PrimaryKeyRelatedField(read_only=True, required=False)
    debit_chart = serializers.PrimaryKeyRelatedField(read_only=True, required=False)
    added_by = serializers.PrimaryKeyRelatedField(read_only=True, required=False)
    branch = serializers.PrimaryKeyRelatedField(read_only=True, required=False)
    teller = serializers.SerializerMethodField(read_only=True)

    def get_teller(self, transaction):
        if transaction.added_by:
            return transaction.added_by.username
        
        return ''
    class Meta:
        model = SystemTransactions
        fields = '__all__'
    

class AuditCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = AuditCategory
        fields = '__all__'
