def crear_nuevo_usuario(client):
    borrar_pantalla()

    username = pedir_input('Ingresá un nombre de usuario: ', max_char=80)
    password = pedir_input('Ingresá una contraseña: ', max_char=80)

    respuesta = client.create_user(username, password)

    if respuesta.status_code != 201:
        errores = respuesta.json()

        for clave, valor in errores.items():
            print(f'\n{clave.capitalize()}: {valor[0]}')

        print('\n' * 2)
        print('1. Intentar de nuevo')
        print('2. Volver al inicio')

        opciones = {str(n) for n in range(1, 3)}
        opcion = pedir_input('Opción: ', opciones=opciones, tipo=int)

        if opcion == 1:
            crear_nuevo_usuario(client)
        else:
            main(client)

    print('\n¡El usuario se creó exitosamente!')
    print('Redirigiendo al inicio de sesión.')
    sleep(2)
    iniciar_sesion(client)
def menu_principal(client):
    borrar_pantalla()

    print('\nMenú Principal\n')
    print('1. Publicar nuevo tuit')
    print('2. Ver tuits personales')
    print('3. Ver tuits de otros usuarios')
    print('4. Administrar cuenta')
    print('5. Cerrar sesión')

    opciones = {str(n) for n in range(1, 6)}
    opcion = pedir_input('Opción: ', opciones=opciones, tipo=int)

    if opcion == 1:
        publicar_tuit(client)

    elif opcion == 2:
        tuits_personales(client)

    elif opcion == 3:
        tuits_de_otros(client)

    elif opcion == 4:
        administrar_cuenta(client)

    elif opcion == 5:
        main(client)
def administrar_cuenta(client):
    borrar_pantalla()

    print(f'\nCuenta de {client.username}:\n')
    print('1. Cambiar usuario')
    print('2. Cambiar contraseña')
    print('3. Guardar cambios')
    print('4. Volver al menú principal')

    cambios = dict()

    while True:
        opciones = {str(n) for n in range(1, 5)}
        opcion = pedir_input('Opción: ', opciones=opciones, tipo=int)

        if opcion == 1:
            cambios['username'] = pedir_input('Ingresá el nuevo usuario: ')

        elif opcion == 2:
            cambios['password'] = pedir_input('Ingresá la nueva contraseña: ')

        elif opcion == 3:
            respuesta = client.update_user(client.id, cambios)
            break

        elif opcion == 4:
            menu_principal(client)

    if respuesta.status_code != 200:
        errores = respuesta.json()

        for clave, valor in errores.items():
            print(f'\n{clave.capitalize()}: {valor[0]}')

        print('\n' * 2)
        print('1. Intentar de nuevo')
        print('2. Volver al inicio')

        opciones = {str(n) for n in range(1, 3)}
        opcion = pedir_input('Opción: ', opciones=opciones, tipo=int)

        if opcion == 1:
            administrar_cuenta(client)
        else:
            main(client)

    print('\n¡Los cambios se efectuaron exitosamente!')

    if 'username' in cambios:
        client.username = cambios.get('username')

    if 'password' in cambios:
        client.password = cambios.get('password')

    sleep(2)
    menu_principal(client)
def publicar_tuit(client):
    borrar_pantalla()

    mensaje = '¿Qué vas a tuitear?\n\n'
    contenido = pedir_input(mensaje, max_char=280)
    respuesta = client.post_tuit(content=contenido)

    if respuesta.status_code != 201:
        print('\nNo se pudo publicar el tuit.')
        intentar_de_nuevo(publicar_tuit, menu_principal)(client)

    print('\n¡El tuit se publicó exitosamente!')
    sleep(2)
    tuits_personales(client)
def tuits_personales(client):
    borrar_pantalla()

    print(f'\nTuits de [{client.username}]')

    respuesta = client.get_user(client.id)

    if respuesta.status_code != 200:
        print('\nNo se pudieron leer los tuits.')
        intentar_de_nuevo(tuits_personales, menu_principal)(client)

    tuits = respuesta.json().get('tuits')

    if not tuits:
        print('\nNo hay tuits para mostrar.')
        sleep(2)
        menu_principal(client)

    for indice, tuit in enumerate(tuits):
        fecha = convertir_fecha(tuit.get('created_on'))
        contenido = tuit.get('content')
        print(f'\n{indice + 1}. {fecha}: {contenido}')

    print('\n' * 2)
    print('1. Publicar otro tuit')
    print('2. Borrar tuit')
    print('3. Volver al menú principal')

    opciones = {str(n) for n in range(1, 4)}
    opcion = pedir_input('Opción: ', opciones=opciones, tipo=int)

    if opcion == 1:
        publicar_tuit(client)

    elif opcion == 2:
        mensaje = 'Ingresá el Nº del tuit: '
        opciones = {str(n) for n in range(1, len(tuits) + 1)}
        opcion = pedir_input(mensaje, opciones=opciones, tipo=int)

        client.delete_tuit(tuits[opcion - 1].get('id'))

        tuits_personales(client)

    else:
        menu_principal(client)
def main(client):
    borrar_pantalla()

    print('\n¡Bienvenido a Tuits!\n')
    print('1. Iniciar sesión')
    print('2. Crear nuevo usuario')
    print('3. Salir')

    opciones = {str(n) for n in range(1, 4)}
    opcion = pedir_input('Opción: ', opciones=opciones, tipo=int)

    if opcion == 1:
        iniciar_sesion(client)

    elif opcion == 2:
        crear_nuevo_usuario(client)

    else:
        print()
        exit()
def iniciar_sesion(client):
    borrar_pantalla()
    username = pedir_input('Ingresá el usuario: ')
    password = pedir_input('Ingresá la contraseña: ')

    # intentamos loguearnos con las credenciales provistas
    # y guardamos el token en el cliente con 'save=True'
    client.get_token(username, password, save=True)

    if not client.token:
        print('\nNo se pudo iniciar sesión.')
        intentar_de_nuevo(iniciar_sesion, main)(client)

    # search devuelve una lista, así que tenemos que nos quedamos
    # con el primer resultado (que debería ser el único)
    respuesta = client.search_users(username).json()[0]

    client.id = respuesta.get('id')
    client.username = username

    menu_principal(client)
def tuits_de_otros(client):
    borrar_pantalla()

    respuesta = client.get_all_users()

    if respuesta.status_code != 200:
        print('No se pudo leer la lista de usuarios.')
        intentar_de_nuevo(tuits_de_otros, menu_principal)(client)

    usuarios = respuesta.json()

    # buscamos el diccionario correspondiente al usuario logueado
    yo_mismo = next((u for u in usuarios if u.get('id') == client.id))

    # y lo borramos de la lista
    del usuarios[usuarios.index(yo_mismo)]

    if not usuarios:
        print('\n¡Parece que sos el único usuario!')
        sleep(2)
        menu_principal(client)

    print('\nLista de usuarios')

    for indice, usuario in enumerate(usuarios):
        username = usuario.get('username')
        total = len(usuario.get('tuits'))

        # <s> = 's' si no hay tuits o si son más de uno, si no <s> = ''
        s = 's' if total > 1 or total == 0 else ''
        print(f'\n{indice + 1}. {username} ({total} tuit{s})')

    print('\n' * 2)
    print('1. Seleccionar usuario')
    print('2. Volver al menú principal')

    opciones = {str(n) for n in range(1, 3)}
    opcion = pedir_input('Opción: ', opciones=opciones, tipo=int)

    if opcion == 2:
        menu_principal(client)

    mensaje = 'Ingresá el Nº del usuario: '
    opciones = {str(n) for n in range(1, len(usuarios) + 1)}
    opcion = pedir_input(mensaje, opciones=opciones, tipo=int)

    usuario = usuarios[opcion - 1]
    tuits = usuario.get('tuits')

    borrar_pantalla()

    print(f'\nTuits de [{usuario.get("username")}]')

    if not tuits:
        print('\nNo hay tuits para mostrar.')
        sleep(2)
        menu_principal(client)

    for indice, tuit in enumerate(tuits):
        fecha = convertir_fecha(tuit.get('created_on'))
        contenido = tuit.get('content')
        print(f'\n{indice + 1}. {fecha}: {contenido}')

    print('\n' * 2)
    print('1. Buscar otro usuario')
    print('2. Volver al menú principal')

    opciones = {str(n) for n in range(1, 3)}
    opcion = pedir_input('Opción: ', opciones=opciones, tipo=int)

    if opcion == 1:
        tuits_de_otros(client)
    elif opcion == 2:
        menu_principal(client)