import shutil
import requests
from pathlib import Path
from bs4 import BeautifulSoup
from urllib.parse import unquote

def download_directory(url, local_path:Path):
    response = requests.get(url)
    if response.status_code != 200:
        return -1

    for a in BeautifulSoup(response.text, "html.parser").find_all("a"):
        name:str = a['href']
        name = unquote(name)
        if name in ('.env', 'MudaeApps.lnk', 'Dashboard.py', 'Downloader.py', 'N-word.gif', 'Start_Download.cmd', 'python-runtime.zip', '../'): continue

        full_url = url + name
        full_local = local_path / name

        if name.endswith("/"):
            if name == 'DashBoard/':
                download_directory(full_url, local_path.parent.parent)
            else:
                full_local.mkdir(parents=True, exist_ok=True)
                download_directory(full_url, full_local)
        else:
            full_local.parent.mkdir(parents=True, exist_ok=True)
            r = requests.get(full_url)
            if r.status_code == 200:
                with open(full_local, "wb") as f:
                    f.write(r.content)
            else:
                print(f"couldn't fetch {full_url}, status code {r.status_code}")
    return 1

def sync_apps_folder(APPS_FOLDER:Path, SERVER_URL):
    if APPS_FOLDER.exists():
        shutil.rmtree(APPS_FOLDER)
    APPS_FOLDER.mkdir(parents=True, exist_ok=True)
    if int(download_directory(SERVER_URL, APPS_FOLDER)) < 0:
        raise ValueError("Invalid response from file server")