import base64
import os
import sys

import requests

from actions_logging.app_logging import logger
from github.env import (exit_on_error_and_write_summary, get_required_env_var,
                        parse_bool_env_var)


def get_file_from_github(repo: str, file_path: str, output_folder: str, ref: str = None) -> None:
    token = get_required_env_var("GLOBAL_CICD_GIT_TOKEN")
    headers = {
        "Authorization": f"Bearer {token}",
        "Accept": "application/vnd.github.v3+json"
    }
    extra_args = f"?ref={ref}" if ref else ""
    api_url = f"https://api.github.com/repos/{repo}/contents/{file_path}{extra_args}"
    logger.info(f"file contents url: {api_url}")
    res = None
    # workaround for executing locally against GH API
    tls_verify = parse_bool_env_var(os.getenv('TLS_VERIFY', True))
    try:
        res = requests.get(api_url, headers=headers, verify=tls_verify)
        res.raise_for_status()
        if res.status_code != 200:
            raise RuntimeError
    except Exception:
        exit_on_error_and_write_summary(f"Error fetching the file: {res.status_code} {res.text}")
    try:
        logger.info_green(f"successfully fetched {file_path}")
        file_content = res.json().get("content")
        if not file_content:
            logger.warning(f"Empty file {file_path}")
        decoded_content = base64.b64decode(file_content).decode("utf-8")
        file_name = os.path.basename(file_path)
        file_path = os.path.join(output_folder, file_name)
        with open(file_path, "w") as output_file:
            logger.info(f"saving the output to {file_path}")
            output_file.write(decoded_content)
        logger.info_green(f"File saved successfully to {file_path}")
    except Exception as e:
        exit_on_error_and_write_summary(f"Error parsing downloaded file or writing it to disk: {e}")


def create_folder_if_not_exists(folder_name: str) -> None:
    try:
        if not os.path.exists(folder_name):
            os.makedirs(folder_name)
            logger.info(f"Folder '{folder_name}' created successfully.")
        else:
            logger.info(f"Folder '{folder_name}' already exists.")
    except Exception as e:
        exit_on_error_and_write_summary(f" An error occurred in create_folder_if_not_exists: {e}")


def main():
    ref = None
    owner = "perimeter-81"
    if len(sys.argv) > 2:
        REPO = sys.argv[1]
        if owner not in REPO:
            REPO = f"{owner}/{REPO}"
        PATHS = sys.argv[2].split("\n")
        file_paths = [ x for x in PATHS if x ]
        logger.info(f"file paths to fetch: {file_paths}")
        if len(sys.argv) > 3:
            if len(sys.argv[3]) > 2:
                output_folder = f"{sys.argv[3]}/"
                logger.info(f"output path provided... will save the files to the folder {output_folder}")
                create_folder_if_not_exists(output_folder)
            else:
                output_folder=""
                logger.info("no output path provided... will save the files to ./ ")
        if len(sys.argv) > 4:
            ref = sys.argv[4]
    # TODO use get function
    else:
        exit_on_error_and_write_summary(f"no file path provided or no repo provided\n syntax: python3 {sys.argv[0]} repo file/path/in/repo1 another/file/path/in/repo")

    logger.info("starting to get files")
    for path in file_paths:
        get_file_from_github(REPO, path, output_folder, ref)
        logger.info(f"got file {path} ")


if __name__ == "__main__":
    main()
