import argparse
import requests
from requests.auth import HTTPBasicAuth
import os


def export_edg_zip(
    base_value, base_uri, username, password, includeSystemTriples, excludeSystemGraphs
):
    filename = f"{base_value}.zip"
    endpoint = "/datasetZip"
    params = {
        "_base": f"urn:x-evn-master:{base_value}",
        "includeSystemTriples": includeSystemTriples,
        "excludeSystemGraphs": excludeSystemGraphs,
    }

    full_url = f"{base_uri}{endpoint}"

    try:
        response = requests.get(
            full_url, params=params, auth=HTTPBasicAuth(username, password), timeout=30
        )
        response.raise_for_status()
    except requests.exceptions.RequestException as e:
        print(f"Error: Failed to make the EDG API request: {e}")
        return

    with open(filename, "wb") as file:
        file.write(response.content)
    print(f'Response saved to "{filename}"')


def import_zip_file(file_name, base_url, username, password):
    url = f"{base_url}/swp"
    file_path = os.path.join("", f"{file_name}.zip")

    if not os.path.exists(file_path):
        print(f"Error: File '{file_path}' not found.")
        return

    with open(file_path, "rb") as file:
        files = {
            "filePath": (f"{file_name}.zip", file, "application/zip; charset=utf-8")
        }
        data = {
            "_fileUpload": "true",
            "_viewClass": "http://topbraid.org/teamwork#ImportDatasetFileService",
            "trig": "false",
        }

        response = requests.post(
            url,
            files=files,
            data=data,
            auth=HTTPBasicAuth(username, password),
            timeout=30,
        )

        if response.status_code == 200:
            print(f"Success: File '{file_name}.zip' uploaded successfully.")
        else:
            print(f"Error: Upload failed with status code {response.status_code}.")
            print("Target server response:", response.text)

    os.remove(file_path)
    print(f"Deleted the file '{file_name}.zip' after import.")


def process_collections_list(
    collections_file,
    url_source,
    url_target,
    source_username,
    source_password,
    target_username,
    target_password,
    includeSystemTriples,
    excludeSystemGraphs,
):
    with open(collections_file, "r") as file:
        collections = [line.strip() for line in file.readlines() if line.strip()]

    for base_value in collections:
        print(f"Processing collection: {base_value}")
        export_edg_zip(
            base_value,
            url_source,
            source_username,
            source_password,
            includeSystemTriples,
            excludeSystemGraphs,
        )
        import_zip_file(base_value, url_target, target_username, target_password)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="Call EDG ZIP export and import APIs with basic authentication."
    )
    parser.add_argument("--collections_file", required=True)
    parser.add_argument("--url_source", required=True)
    parser.add_argument("--url_target", required=True)
    parser.add_argument("--source_username", required=True)
    parser.add_argument("--source_password", required=True)
    parser.add_argument("--target_username", required=True)
    parser.add_argument("--target_password", required=True)
    parser.add_argument(
        "--includeSystemTriples", choices=["true", "false"], default="false"
    )
    parser.add_argument(
        "--excludeSystemGraphs", choices=["true", "false"], default="true"
    )
    args = parser.parse_args()

    process_collections_list(
        args.collections_file,
        args.url_source,
        args.url_target,
        args.source_username,
        args.source_password,
        args.target_username,
        args.target_password,
        args.includeSystemTriples == "true",
        args.excludeSystemGraphs == "true",
    )
