import typing

from apps.authentication.models import Organization, OrganizationType


def get_users_of_organization(org: Organization) -> typing.Any:
    """ get users of an organizations """
    user_relations = org.user_organization.all()

    users_list = [{
        'name': f"{rel.user.first_name} {rel.user.last_name}",
        'national_code': rel.user.national_code,
        'mobile': rel.user.mobile,
        'phone': rel.user.phone,
        'address': rel.user.address
    } for rel in user_relations]

    return users_list


def get_all_org_child(org: Organization = None) -> typing.Any:
    """
    get all child of an organization
    """
    descendants = []
    children = org.parents.all()
    for child in children:
        descendants.append(child)
        descendants.extend(get_all_org_child(child))
    return descendants


def get_all_org_type_child(org_type: OrganizationType = None) -> typing.Any:
    """
    get all child of an organization
    """
    descendants = []
    children = org_type.children.all()
    for child in children:
        descendants.append(child)
        descendants.extend(get_all_org_type_child(child))
    return descendants


def get_bank_info(org, device=None):
    if device:
        # get organization bank account that set to a device
        bank_account_device_links = org.bank_account_device_links.filter(device=device)
        bank = bank_account_device_links.first().bank_account \
            if bank_account_device_links.exists() else org.bank_information.first()
    else:
        bank = org.bank_information.first()
    if not bank:
        return {}
    return {
        "credit_card": bank.card,
        "sheba": f"IR{bank.sheba}",
        "account": bank.account,
    }
