from decimal import Decimal
from django.utils import timezone
from common.utils import format_datetime
from ledger.models import ledger_master_table, ledger_ob_table


def create_ledger_master_and_opening_balance(
    *,
    current_fy,
    branch_id,
    master_id,
    master_name="",
    ledger_type,
    ledger_mode,
    payable=0,
    receivable=0,
    created_by=0,
    updated_by=0,
    is_active=1,
    status=1,
    update=False,
):
    payable_amount = Decimal(str(payable or 0))
    receivable_amount = Decimal(str(receivable or 0))
    date_time = timezone.localtime(timezone.now())
    date_time_str = format_datetime(date_time)
    
    # Format master_name to Title Case
    master_name = (master_name or "").strip().title()

    # Payable should be positive, receivable should be negative.
    if payable_amount > 0:
        opening_balance = payable_amount
    elif receivable_amount > 0:
        opening_balance = -receivable_amount
    else:
        opening_balance = Decimal("0")

    # Search for existing ledger master based on user criteria: branch_id, master_id, and current_fy
    # Also including ledger_type and ledger_mode to ensure we target the correct record type.
    ledger_master = ledger_master_table.objects.filter(
        branch_id=branch_id,
        master_id=master_id,
        current_fy=current_fy,
        ledger_type=ledger_type,
        ledger_mode=ledger_mode
    ).first()

    if ledger_master:
        ledger_master.master_name = master_name
        ledger_master.updated_by = updated_by
        ledger_master.updated_on = date_time_str
        ledger_master.save()

        ledger_ob_table.objects.filter(ledger_master_id=ledger_master.id).update(
            opening_balance=opening_balance,
            updated_by=updated_by,
            updated_on=date_time_str
        )
        return ledger_master

    ledger_master = ledger_master_table.objects.create(
        current_fy=current_fy or 0,
        branch_id=branch_id or 0,
        master_id=master_id or 0,
        master_name=master_name,
        ledger_type=ledger_type,
        ledger_mode=ledger_mode,
        is_active=is_active,
        status=status,
        created_by=created_by or 0,
        updated_by=updated_by or 0,
        created_on=date_time_str,
        updated_on=date_time_str,
    )

    ledger_ob_table.objects.create(
        ledger_master_id=ledger_master.id,
        opening_balance=opening_balance,
        is_active=is_active,
        status=status,
        created_by=created_by or 0,
        updated_by=updated_by or 0,
        created_on=date_time_str,
        updated_on=date_time_str,
    )

    return ledger_master
