from rest_framework import serializers
from datetime import datetime, timedelta
from .models import *
from django.db.models import Q, Sum

class BulkImportInitiationSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    date_added = serializers.CharField(read_only=True)
    last_updated = serializers.CharField(read_only=True)
    initiation_added_by = serializers.CharField(read_only=True) 
    organisation_branch_name = serializers.CharField(read_only=True, source="organisation_branch.name")
    organisation_name = serializers.CharField(read_only=True, source="organisation_branch.branch_organisation.name")
    number_of_successful = serializers.SerializerMethodField(read_only=True)
    total_amount = serializers.SerializerMethodField(read_only=True)
    number_of_processed = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = BulkImportInitiation
        fields = '__all__'
    
    def get_number_of_successful(self, obj):
        records = []
        if obj.import_type == 'loans':
            records = BulkTempLoansImport.objects.filter(loan_initiation=obj).all()

        if obj.import_type == 'loans-sec':
            records = BulkTempLoanSecurityImport.objects.filter(initiation=obj).all()

        if obj.import_type == 'members':
            records = BulkTempMembersImport.objects.filter(member_initiation=obj).all()
        if obj.import_type == 'savings':
            records = BulkTempDepositsImports.objects.filter(initiation=obj).all()
        if obj.import_type == 'client-deposits':
            records = BulkTempClientDepositsImports.objects.filter(initiation=obj).all()
        
        if obj.import_type == 'shares':
            records = BulkTempSharesImports.objects.filter(initiation=obj).all()

        if obj.import_type == 'accounts':
            records = BulkTempAccountsImport.objects.filter(member_initiation=obj).all()
        
        if obj.import_type == 'member-numbers':
            records = BulkTempMemberNumberImport.objects.filter(member_initiation=obj).all()

        if obj.import_type == 'sms-subscriptions':
            records = BulkTempSmsSubscriptonImports.objects.filter(initiation=obj).all()

        if obj.import_type == 'mm-banking-subscriptions':
            records = BulkTempMMBankingSubscriptonImports.objects.filter(initiation=obj).all()
        
        if obj.import_type == 'fixed-deposits':
            records = BulkTempFixedDepositsImports.objects.filter(initiation=obj).all()
        
        if obj.import_type == 'client-photos':
            records = BulkTempClientPhotosImports.objects.filter(initiation=obj).all()
        if obj.import_type == 'customer-fields':
            records = BulkTempCustomerFieldsImport.objects.filter(initiation=obj).all()
        if obj.import_type == 'overdrafts':
            records = BulkTempOverDraftsImport.objects.filter(initiation=obj).all()   
        if obj.import_type == 'member-email-update':
            records = BulkTempMemberEmailImport.objects.filter(initiation=obj).all()
        if obj.import_type == 'salary':
            records = BulkTempSalaryImports.objects.filter(initiation=obj).all()
        
        if obj.import_type == 'neg-savings':
            records = BulkTempNegativeSavingsImports.objects.filter(initiation=obj).all()
        return len(records) if records else 0

    def get_total_amount(self, obj):
        amount = 0
        if obj.import_type == 'loans':
            records = BulkTempLoansImport.objects.filter(loan_initiation=obj).aggregate(total_loan_amount=Sum('loan_amount'))
            amount = records['total_loan_amount'] if records['total_loan_amount'] else 0
        
        if obj.import_type == 'savings':
            records = BulkTempDepositsImports.objects.filter(initiation=obj).aggregate(total_savings_amount=Sum('amount'))
            amount = records['total_savings_amount'] if records['total_savings_amount'] else 0
        
        if obj.import_type == 'client-deposits':
            records = BulkTempClientDepositsImports.objects.filter(initiation=obj).aggregate(total_savings_amount=Sum('amount'))
            amount = records['total_savings_amount'] if records['total_savings_amount'] else 0
        
        if obj.import_type == 'client_deposits':
            records = BulkTempClientDepositsImports.objects.filter(initiation=obj).all()
        
        if obj.import_type == 'shares':
            records = BulkTempSharesImports.objects.filter(initiation=obj).aggregate(total_share_amount=Sum('amount'))
            amount = records['total_share_amount'] if records['total_share_amount'] else 0
        
        if obj.import_type == 'accounts':
            records = BulkTempAccountsImport.objects.filter(member_initiation=obj).all()
        
        if obj.import_type == 'fixed-deposits':
            records = BulkTempFixedDepositsImports.objects.filter(initiation=obj).aggregate(total_amount=Sum('amount'))
            amount = records['total_amount'] if records['total_amount'] else 0
        
        if obj.import_type == 'overdrafts':
            records = BulkTempOverDraftsImport.objects.filter(initiation=obj).aggregate(total_amount=Sum('amount'))
            amount = records['total_amount'] if records['total_amount'] else 0
        
        if obj.import_type == 'neg-savings':
            records = BulkTempNegativeSavingsImports.objects.filter(initiation=obj).aggregate(total_savings_amount=Sum('amount'))
            amount = records['total_savings_amount'] if records['total_savings_amount'] else 0
        
        if obj.import_type == 'salary':
            records = BulkTempSalaryImports.objects.filter(initiation=obj).aggregate(total_amount=Sum('amount'))
            amount = records['total_amount'] if records['total_amount'] else 0    
        
        return amount
    
    def get_number_of_processed(self, obj):
        records = []
        if obj.import_type == 'savings':
            records = BulkTempDepositsImports.objects.filter(initiation=obj,status="Processed").all()
        if obj.import_type == 'client-deposits':
            records = BulkTempClientDepositsImports.objects.filter(initiation=obj,status="Processed").all()
        if obj.import_type == 'shares':
            records = BulkTempSharesImports.objects.filter(initiation=obj,status="Processed").all()
        if obj.import_type == 'sms-subscriptions':
            records = BulkTempSmsSubscriptonImports.objects.filter(initiation=obj,status="Processed").all()
        if obj.import_type == 'mm-banking-subscriptions':
            records = BulkTempMMBankingSubscriptonImports.objects.filter(initiation=obj,status="Processed").all()
        if obj.import_type == 'fixed-deposits':
            records = BulkTempFixedDepositsImports.objects.filter(initiation=obj,status="Processed").all()
        if obj.import_type == 'client-photos':
            records = BulkTempClientPhotosImports.objects.filter(initiation=obj,status="Processed").all()
        if obj.import_type == 'customer-fields':
            records = BulkTempCustomerFieldsImport.objects.filter(initiation=obj,status="Processed").all()
        if obj.import_type == 'overdrafts':
            records = BulkTempOverDraftsImport.objects.filter(initiation=obj,status="Processed").all()
        if obj.import_type == 'member-email-update':
            records = BulkTempMemberEmailImport.objects.filter(initiation=obj,status="Processed").all()
        if obj.import_type == 'salary':
            records = BulkTempSalaryImports.objects.filter(initiation=obj, status="Processed").all()    

        if obj.import_type == 'neg-savings':
            records = BulkTempNegativeSavingsImports.objects.filter(initiation=obj,status="Processed").all()
        return len(records) if records else 0

class BulkTempLoansImportSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    date_added   = serializers.CharField(read_only=True)
    last_updated = serializers.CharField(read_only=True)
    loan_initiation_added_by = serializers.CharField(read_only=True) 
    loan_details = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = BulkTempLoansImport
        fields = '__all__'
    
    def get_loan_details(self, obj):
        data = {}
        customer = Customer.objects.get(pk=obj.customer.id)
        data['customer_name'] = customer.name
        data['member_number'] = customer.member_number
        data['organisation_id'] = obj.organisation_branch.branch_organisation.id

        return data

class BulkTempLoanSecurityImportSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)

    class Meta:
        model = BulkTempLoanSecurityImport
        fields = '__all__'

class BulkTempMembersImportSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    date_added = serializers.CharField(read_only=True)
    last_updated = serializers.CharField(read_only=True)
    member_initiation_added_by = serializers.CharField(read_only=True) 

    class Meta:
        model = BulkTempMembersImport
        fields = '__all__'

class BulkTempAccountsImportSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    date_added = serializers.CharField(read_only=True)
    last_updated = serializers.CharField(read_only=True)
    member_initiation_added_by = serializers.CharField(read_only=True) 

    class Meta:
        model = BulkTempAccountsImport
        fields = '__all__'

class BulkTempMemberNumberImportSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    date_added = serializers.CharField(read_only=True)
    last_updated = serializers.CharField(read_only=True)
    member_initiation_added_by = serializers.CharField(read_only=True) 

    class Meta:
        model = BulkTempAccountsImport
        fields = '__all__'

class BulkTempDepositsImportsImportSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    customer_name = serializers.CharField(source='customer.name',read_only=True)
    customer_member_number     = serializers.CharField(source='customer.member_number',read_only=True)
    customer_old_member_number = serializers.CharField(source='customer.old_member_number',read_only=True)
    organisation_branch_name   = serializers.CharField(source='organisation_branch.name',read_only=True)
    organisation_name          = serializers.CharField(source='organisation_branch.branch_organisation.name',read_only=True)
    date_added = serializers.CharField(read_only=True)
    added_by   = serializers.CharField(read_only=True) 
    
    class Meta:
        model = BulkTempDepositsImports
        fields = '__all__'

class BulkTempClientDepositsImportsSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    customer_name = serializers.CharField(source='customer.name',read_only=True)
    customer_member_number     = serializers.CharField(source='customer.member_number',read_only=True)
    customer_old_member_number = serializers.CharField(source='customer.old_member_number',read_only=True)
    account_no     = serializers.CharField(source='account.account_no',read_only=True)
    organisation_branch_name   = serializers.CharField(source='organisation_branch.name',read_only=True)
    organisation_name          = serializers.CharField(source='organisation_branch.branch_organisation.name',read_only=True)
    date_added = serializers.CharField(read_only=True)
    added_by   = serializers.CharField(read_only=True) 
    
    class Meta:
        model = BulkTempClientDepositsImports
        fields = '__all__'

class BulkTempSalaryImportsSerializer(serializers.ModelSerializer):
    debit_chart_name = serializers.CharField(source='debit_chart.name', read_only=True)
    organisation_branch_name = serializers.CharField(source='organisation_branch.name', read_only=True)
    added_by_name = serializers.CharField(source='added_by.username', read_only=True)
    customer_name = serializers.CharField(source='customer.name', read_only=True)
    customer_member_number = serializers.CharField(source='customer.member_number', read_only=True)

    class Meta:
        model = BulkTempSalaryImports
        fields = [
            'id',
            'customer',
            'customer_member_number',
            'customer_name',
            'salary_account',
            'amount',
            'payment_method',
            'record_date',
            'status',
            'msg',
            'debit_chart',
            'debit_chart_name',
            'organisation_branch',
            'organisation_branch_name',
            'added_by',
            'added_by_name',
            'date_added',
            'last_updated'
        ]

        read_only_fields = [
            'id',
            'status',
            'msg',
            'debit_chart_name',
            'organisation_branch_name',
            'added_by_name',
            'customer_name',
            'customer_member_number',
            'date_added',
            'last_updated'
        ]     
        
class BulkTempFixedDepositsImportsSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    customer_name = serializers.CharField(source='customer.name',read_only=True)
    customer_member_number     = serializers.CharField(source='customer.member_number',read_only=True)
    customer_old_member_number = serializers.CharField(source='customer.old_member_number',read_only=True)
    organisation_branch_name   = serializers.CharField(source='organisation_branch.name',read_only=True)
    organisation_name          = serializers.CharField(source='organisation_branch.branch_organisation.name',read_only=True)
    date_added = serializers.CharField(read_only=True)
    added_by   = serializers.CharField(read_only=True) 
    
    class Meta:
        model = BulkTempFixedDepositsImports
        fields = '__all__'


class BulkTempSharesImportsSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    customer_name = serializers.CharField(source='customer.name',read_only=True)
    customer_member_number     = serializers.CharField(source='customer.member_number',read_only=True)
    customer_old_member_number = serializers.CharField(source='customer.old_member_number',read_only=True)
    organisation_branch_name   = serializers.CharField(source='organisation_branch.name',read_only=True)
    organisation_name          = serializers.CharField(source='organisation_branch.branch_organisation.name',read_only=True)
    date_added = serializers.CharField(read_only=True)
    added_by   = serializers.CharField(read_only=True) 
    
    class Meta:
        model = BulkTempSmsSubscriptonImports
        fields = '__all__'
        
class BulkTempSmsSubscriptonImportsSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    customer_name = serializers.CharField(source='customer.name',read_only=True)
    customer_member_number     = serializers.CharField(source='customer.member_number',read_only=True)
    customer_old_member_number = serializers.CharField(source='customer.old_member_number',read_only=True)
    organisation_branch_name   = serializers.CharField(source='organisation_branch.name',read_only=True)
    organisation_name          = serializers.CharField(source='organisation_branch.branch_organisation.name',read_only=True)
    date_added = serializers.CharField(read_only=True)
    added_by   = serializers.CharField(read_only=True) 
    
    class Meta:
        model = BulkTempSmsSubscriptonImports
        fields = '__all__'

class BulkTempMMBankingSubscriptonImportsSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    customer_name = serializers.CharField(source='customer.name',read_only=True)
    customer_member_number     = serializers.CharField(source='customer.member_number',read_only=True)
    customer_old_member_number = serializers.CharField(source='customer.old_member_number',read_only=True)
    organisation_name          = serializers.CharField(source='organisation.name',read_only=True)
    date_added = serializers.CharField(read_only=True)
    added_by   = serializers.CharField(read_only=True) 
    
    class Meta:
        model = BulkTempMMBankingSubscriptonImports
        fields = '__all__'


class BulkTempClientPhotosImportsSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    customer_name = serializers.CharField(source='customer.name',read_only=True)
    customer_member_number     = serializers.CharField(source='customer.member_number',read_only=True)
    customer_old_member_number = serializers.CharField(source='customer.old_member_number',read_only=True)
    organisation_branch_name   = serializers.CharField(source='organisation_branch.name',read_only=True)
    organisation_name          = serializers.CharField(source='organisation_branch.branch_organisation.name',read_only=True)
    date_added = serializers.CharField(read_only=True)
    added_by   = serializers.CharField(read_only=True) 
    
    class Meta:
        model = BulkTempClientPhotosImports
        fields = '__all__'

class BulkTempCustomerFieldsImportSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    customer_name = serializers.CharField(source='customer.name',read_only=True)
    customer_member_number     = serializers.CharField(source='customer.member_number',read_only=True)
    customer_old_member_number = serializers.CharField(source='customer.old_member_number',read_only=True)
    organisation_branch_name   = serializers.CharField(source='organisation_branch.name',read_only=True)
    organisation_name          = serializers.CharField(source='organisation_branch.branch_organisation.name',read_only=True)
    date_added  = serializers.CharField(read_only=True)
    added_by    = serializers.CharField(read_only=True) 

    class Meta:
        model = BulkTempCustomerFieldsImport
        fields = '__all__'

class BulkTempOverDraftsImportSerializer(serializers.ModelSerializer):
    id = serializers.CharField(read_only=True)
    customer_name = serializers.CharField(source='customer.name',read_only=True)
    customer_member_number     = serializers.CharField(source='customer.member_number',read_only=True)
    customer_old_member_number = serializers.CharField(source='customer.old_member_number',read_only=True)
    organisation_branch_name   = serializers.CharField(source='organisation_branch.name',read_only=True)
    organisation_name          = serializers.CharField(source='organisation_branch.branch_organisation.name',read_only=True)
    date_added  = serializers.CharField(read_only=True)
    added_by    = serializers.CharField(read_only=True) 

    class Meta:
        model = BulkTempOverDraftsImport
        fields = '__all__'

class BulkTempLicenseImportSerializer(serializers.ModelSerializer):
    id                 = serializers.CharField(read_only=True)
    organisation_name  = serializers.CharField(source='organisation_branch.branch_organisation.name',read_only=True)
    date_added         = serializers.CharField(read_only=True)
    added_by           = serializers.CharField(read_only=True) 

    class Meta:
        model = BulkTempLicenseImport
        fields = '__all__'



class BulkTempMemberEmailImportSerializer(serializers.ModelSerializer):
    id            = serializers.CharField(read_only=True)
    customer_name = serializers.CharField(source='customer.name', read_only=True)
    date_added    = serializers.CharField(read_only=True)
    added_by      = serializers.CharField(read_only=True)

    class Meta:
        model = BulkTempMemberEmailImport
        fields = '__all__'
