import argparse
import getpass
import os

from pyedgeconnect import Orchestrator

# Parse runtime arguments
parser = argparse.ArgumentParser()
parser.add_argument(
    "-o",
    "--orch",
    help="specify Orchestrator URL",
    type=str,
)
args = parser.parse_args()

# Set Orchestrator FQDN/IP via arguments, environment variable,
# or user input
if vars(args)["orch"] is not None:
    orch_url = vars(args)["orch"]
elif os.getenv("ORCH_URL") is not None:
    orch_url = os.getenv("ORCH_URL")
else:
    orch_url = input("Orchstrator IP or FQDN: ")

# Set Orchestrator API Key via environment variable or user input
if os.getenv("ORCH_API_KEY") is not None:
    orch_api_key = os.getenv("ORCH_API_KEY")
else:
    orch_api_key_input = input("Orchstrator API Key (enter to skip): ")
    if len(orch_api_key_input) == 0:
        orch_api_key = None
        # Set user and password if present in environment variable
        orch_user = os.getenv("ORCH_USER")
        orch_pw = os.getenv("ORCH_PASSWORD")
    else:
        orch_api_key = orch_api_key_input

# Instantiate Orchestrator with ``log_console`` enabled for
# printing log messages to terminal
orch = Orchestrator(
    orch_url,
    api_key=orch_api_key,
    log_console=True,
    verify_ssl=False,
)

# If not using API key, login to Orchestrator with username/password
if orch_api_key is None:
    # If username/password not in environment variables, prompt user
    if orch_user is None:
        orch_user = input("Enter Orchestrator username: ")
        orch_pw = getpass.getpass("Enter Orchestrator password: ")
    # Check if multi-factor authentication required
    mfa_prompt = input("Are you using MFA for this user (y/n)?: ")
    if mfa_prompt == "y":
        orch.send_mfa(orch_user, orch_pw, temp_code=False)
        token = input("Enter MFA token: ")
    else:
        token = ""
    # Login to Orchestrator
    confirm_auth = orch.login(orch_user, orch_pw, mfacode=token)
    # Check that user/pass authentication works before proceeding
    if confirm_auth:
        pass
    else:
        print("Authentication to Orchestrator Failed")
        exit()
# If API key specified, check that key is valid before proceeding
else:
    confirm_auth = orch.get_orchestrator_hello()
    if confirm_auth != "There was an internal server error.":
        pass
    else:
        print("Authentication to Orchestrator Failed")
        exit()

# set user password details
username = "API_CREATED_USER"
password = 1
confirm_password = 2

# confirm password with interactive user
while password != confirm_password:
    print(
        "\nPassword must be at least 8 characters long and contain "
        + "the following items:\n"
        + "upper case letter, lower case letter, "
        + "a number, a special character\n"
    )
    password = getpass("Enter user's password: ")
    confirm_password = getpass("Confirm user's password: ")
    if password != confirm_password:
        print("Passwords do not match, please try again\n\n")

# create user
# THIS FUNCTION ALSO UPDATES EXISTING USERS
# MAKE SURE NOT TO ACCIDENTLY CHANGE DETAILS
# OF AN EXISTING PRODUCTION USER
orch.create_or_update_user(
    new_user=True,
    user_pk="",
    first_name="first_name",
    last_name="last_name",
    phone="",
    email="jdoe@not-a-real-email.com",
    status="Active",
    role="Network Monitor",
    username=username,
    password=password,
    repeat_password=password,
    two_factor_email=False,
    two_factor_app=False,
)

# retrieve and print user details of newly created user
user_details = orch.get_user(username)
for item in user_details.items():
    print(item)

# if not using API key, logout from Orchestrator
if orch_api_key is None:
    orch.logout()
else:
    pass
