from __future__ import annotations

from typing import TYPE_CHECKING

from simorgh.apps.hr_core.services.encryption import encrypt_field

if TYPE_CHECKING:
    from simorgh.apps.hr_core.models import Employee, EmployeeBankAccount


def add_bank_account(
    *,
    employee: "Employee",
    bank_name: str,
    account_no: str,
    iban: str = "",
    is_default: bool = False,
) -> "EmployeeBankAccount":
    from simorgh.apps.hr_core.models import EmployeeBankAccount

    if is_default:
        EmployeeBankAccount.objects.filter(
            employee=employee, is_default=True
        ).update(is_default=False)

    return EmployeeBankAccount.objects.create(
        tenant_id=employee.tenant_id,
        organization_node_id=employee.organization_node_id,
        employee=employee,
        bank_name=bank_name.strip(),
        account_no=encrypt_field(account_no),
        iban=encrypt_field(iban) if iban else "",
        is_default=is_default,
    )


def update_bank_account(
    account: "EmployeeBankAccount",
    *,
    bank_name: str | None = None,
    account_no: str | None = None,
    iban: str | None = None,
    is_default: bool | None = None,
) -> "EmployeeBankAccount":
    from simorgh.apps.hr_core.models import EmployeeBankAccount

    if bank_name is not None:
        account.bank_name = bank_name.strip()
    if account_no is not None:
        account.account_no = encrypt_field(account_no)
    if iban is not None:
        account.iban = encrypt_field(iban) if iban else ""
    if is_default is True:
        EmployeeBankAccount.objects.filter(
            employee=account.employee, is_default=True
        ).exclude(pk=account.pk).update(is_default=False)
        account.is_default = True
    elif is_default is False:
        account.is_default = False
    account.save()
    return account


def delete_bank_account(account: "EmployeeBankAccount") -> None:
    account.delete()
