#!/usr/bin/python3

import os
import requests
import tarfile
import shutil

config_dir = os.getenv('XDG_CONFIG_HOME', os.path.expanduser('~/.config'))

# URLs for .tar.gz files
BE_URL = "https://github.com/Faugus/components/releases/download/{}/be.tar.gz"
EAC_URL = "https://github.com/Faugus/components/releases/download/{}/eac.tar.gz"
DOWNLOAD_DIR = f"{config_dir}/faugus-launcher/components"
REPO_URL = "https://api.github.com/repos/Faugus/components/releases/latest"
VERSION_FILE = f"{DOWNLOAD_DIR}/version.txt"

# Function to get the latest version from GitHub releases
def get_latest_version():
    response = requests.get(REPO_URL)
    if response.status_code == 200:
        release_info = response.json()
        return release_info['tag_name']  # Returns the latest tag name
    else:
        print(f"Failed to access {REPO_URL}. Status code: {response.status_code}", flush=True)
        return None

# Function to get the installed version from a local file
def get_installed_version():
    if os.path.exists(VERSION_FILE):
        with open(VERSION_FILE, "r") as f:
            return f.read().strip()
    return None

# Function to download and extract the tar.gz file
def download_and_extract(url, download_dir):
    file_name = url.split('/')[-1]
    download_path = os.path.join(download_dir, file_name)

    # Download the file
    response = requests.get(url, stream=True)
    if response.status_code == 200:
        with open(download_path, "wb") as f:
            f.write(response.content)

        # Extract the file with a filter to avoid deprecation warning
        with tarfile.open(download_path, "r:gz") as tar:
            # The filter function now accepts two arguments: tarinfo and path
            tar.extractall(path=download_dir, filter=lambda tarinfo, path: tarinfo)

        # Remove the .tar.gz file after extraction
        os.remove(download_path)
        print("Done!", flush=True)
    else:
        print(f"Failed to download {file_name}. Status code: {response.status_code}", flush=True)

# Function to check for updates
def check_for_updates():
    # Get the latest version from GitHub
    latest_version = get_latest_version()
    installed_version = get_installed_version()

    if latest_version:

        # Compare the latest version with the installed version
        if latest_version != installed_version:

            # URLs for the files with the latest version
            be_url = BE_URL.format(latest_version)
            eac_url = EAC_URL.format(latest_version)

            # Remove old directories if they exist
            if os.path.exists(DOWNLOAD_DIR):
                shutil.rmtree(DOWNLOAD_DIR)  # Remove old files
            os.makedirs(DOWNLOAD_DIR, exist_ok=True)

            # Download and extract the files
            print("Updating BattlEye...", flush=True)
            download_and_extract(be_url, DOWNLOAD_DIR)
            print("Updating Easy Anti-Cheat...", flush=True)
            download_and_extract(eac_url, DOWNLOAD_DIR)

            # Update the version file with the latest version
            with open(VERSION_FILE, "w") as f:
                f.write(latest_version)
        else:
            print("Components are up to date.", flush=True)

def main():
    # Execute the update check
    check_for_updates()

if __name__ == "__main__":
    main()
