from rest_framework.serializers import ModelSerializer
from rest_framework import serializers
from .models import *


class ChartOfAccountSerializer(ModelSerializer):
    class Meta:
        model = ChartOfAccount
        fields = '__all__'


class ExpenseSerializer(ModelSerializer):
    class Meta:
        model = Expense
        fields = '__all__'


class DepositSerializer(ModelSerializer):
    class Meta:
        model = Deposit
        fields = '__all__'


class TransactionSerializer(ModelSerializer):
    class Meta:
        model = Transaction
        fields = '__all__'


class LoanPortfolioSerializer(ModelSerializer):
    class Meta:
        model = LoanPortfolio
        fields = '__all__'


class CustomerOrderInvoiceSerializer(ModelSerializer):
    class Meta:
        model = CustomerOrderInvoice
        fields = '__all__'


class Journal_EntrySerializer(ModelSerializer):
    class Meta:
        model = Journal_Entry
        fields = '__all__'


class DebitEntrySerializer(ModelSerializer):
    class Meta:
        model = DebitEntry
        fields = '__all__'


class CreditEntrySerializer(ModelSerializer):
    class Meta:
        model = CreditEntry
        fields = '__all__'


class AssetSerializer(ModelSerializer):
    class Meta:
        model = Asset
        fields = '__all__'


class DividendSerializer(ModelSerializer):
    class Meta:
        model = Dividend
        fields = '__all__'


# ---------------------------------------------------------------------------
# NEW SERIALIZERS  (account types, GL, mappings, manual journals)
# ---------------------------------------------------------------------------

class AccountTypeDetailSerializer(ModelSerializer):
    class Meta:
        model = AccountTypeDetail
        fields = '__all__'


class AccountTypeSerializer(ModelSerializer):
    type_details = AccountTypeDetailSerializer(many=True, read_only=True)

    class Meta:
        model = AccountType
        fields = '__all__'


class ChartOfAccountDetailSerializer(ModelSerializer):
    account_type_name = serializers.CharField(
        source='account_type.name', read_only=True, default='')
    account_type_key = serializers.CharField(
        source='account_type.type_key', read_only=True, default='')
    account_detail_type_name = serializers.CharField(
        source='account_detail_type.name', read_only=True, default='')
    parent_account_name = serializers.CharField(
        source='parent_account.account_name', read_only=True, default='')
    normal_balance = serializers.CharField(
        source='account_type.normal_balance', read_only=True, default='debit')
    financial_statement = serializers.CharField(
        source='account_type.financial_statement', read_only=True, default='balance_sheet')

    class Meta:
        model = ChartOfAccount
        fields = '__all__'


class AccountHistorySerializer(ModelSerializer):
    account_name = serializers.CharField(
        source='account.account_name', read_only=True, default='')
    account_number = serializers.CharField(
        source='account.account_number', read_only=True, default='')
    account_type_name = serializers.CharField(
        source='account.account_type.name', read_only=True, default='')

    class Meta:
        model = AccountHistory
        fields = '__all__'


class AccountMappingSerializer(ModelSerializer):
    debit_account_name = serializers.CharField(
        source='debit_account.account_name', read_only=True, default='')
    credit_account_name = serializers.CharField(
        source='credit_account.account_name', read_only=True, default='')

    class Meta:
        model = AccountMapping
        fields = '__all__'


class ManualJournalLineSerializer(ModelSerializer):
    account_name = serializers.CharField(
        source='account.account_name', read_only=True, default='')
    account_number = serializers.CharField(
        source='account.account_number', read_only=True, default='')
    account_type = serializers.CharField(
        source='account.account_type.type_key', read_only=True, default='')

    class Meta:
        model = ManualJournalLine
        fields = '__all__'


class ManualJournalEntrySerializer(ModelSerializer):
    journal_lines = ManualJournalLineSerializer(many=True, read_only=True)
    created_by_name = serializers.SerializerMethodField()

    def get_created_by_name(self, obj):
        if obj.created_by:
            return f"{obj.created_by.first_name} {obj.created_by.last_name}"
        return ""

    class Meta:
        model = ManualJournalEntry
        fields = '__all__'
