import refinitiv.data as rd
import time
from datetime import datetime 
import random

rd.open_session()
start = datetime.now()

def get_fundamental_and_reference_data(
        universe,
        fields,
        max_attempts=4,
        parameters=None,
        row_headers=None,
        use_field_names_in_headers=None,
        extended_params=None,
        ncalls = 0
        ):

    for i in range(max_attempts):
        
        try:
            response = rd.content.fundamental_and_reference.Definition(
            universe=universe,
            fields=fields,
            parameters=parameters,
            row_headers=row_headers,
            use_field_names_in_headers=use_field_names_in_headers,
            extended_params=extended_params).get_data()
            return response._http_status['http_status_code']
        except Exception as e:
            error = str(e).split('Requested')[0]
            
            # check if 401 error, if so restart and fully exit script
            if 'code 401' in error or 'token expired ' in error:
                print(f'\n\n-> Error 401: {error}')
                print(e)
                print('Script started at: ', start)
                print('Current time: ', datetime.now())
                print('Number of calls done: ', ncalls)
                
                time.sleep(1)
                print(f'{datetime.now()} -- closing session')
                rd.close_session()
                print(f'{datetime.now()} -- session closed')
                time.sleep(2.5)
                print(f'{datetime.now()} -- opening new session')
                rd.open_session()
                print(f'{datetime.now()} -- session opened')
                time.sleep(1)
                print(f'{datetime.now()} -- continuing')
            
            return e

ncalls = 0
while True:
    ncalls += 1
    http=get_fundamental_and_reference_data(universe="VOD.L", fields="TR.ClosePrice", ncalls=ncalls)
    print(f'    - call {ncalls} -- http: {http}', end='\r')
    
    #  to ensure no 429 data limiting calls
    time.sleep(random.uniform(0, 0.5))