#!python

from requests_html import HTMLSession
import sys


URL = "https://original.365online.com/online365/spring/authentication"
SESSION = HTMLSession()


def get_base_post_data(execution):
    return {
        "form:userId": user_id,
        "form:ajaxRequestStatus": "AJAX REQUEST PROCESSOR INACTIVE",
        "form:j_id131:j_id146:contactPanelOpenedState": "",
        "form:j_id131:j_id146:contactUsPanelOpenedState": "",
        "form": "form",
        "autoScroll": "",
        "form:continue": "form:continue",
        "javax.faces.ViewState": execution,
    }


def enter_username_and_unknown():
    params = {"execution": "e1s1"}
    post_data = get_base_post_data(params["execution"])
    response = SESSION.get(URL)
    if response.html.find("#form\:phoneNumber"):
        post_data["form:phoneNumber"] = phone
    else:
        for i, suffix in enumerate(("date", "month", "year")):
            post_data[f"form:dateOfBirth_{suffix}"] = dob[i]
    return SESSION.post(URL, data=post_data, params=params)


def enter_pin(pin_screen):
    params = {"execution": "e1s2"}
    post_data = get_base_post_data(params["execution"])
    for input in pin_screen.html.find("[id^=form\:security_number_digit]"):
        input_id = input.attrs["id"]
        pin_no = int(input_id[-1]) - 1
        post_data[input_id] = pin[pin_no]
    return SESSION.post(URL, data=post_data, params=params)


def get_balance(pin_response):
    element = pin_response.html.find(
        "#form\:retailAccountSummarySubView0\:balance", first=True
    )
    return element.text.replace(",", "")


if __name__ == "__main__":
    if len(sys.argv) != 5:
        print(
            f"usage: {sys.argv[0]} <user id> <phone> <pin> <dob>",
            file=sys.stderr,
        )
        sys.exit(1)
    # parse args
    user_id, phone, pin, dob = sys.argv[1:]
    dob = dob[:2], dob[2:4], dob[4:]
    phone = phone[-4:]
    # start
    pin_screen = enter_username_and_unknown()
    main_screen = enter_pin(pin_screen)
    print(get_balance(main_screen))
