"""
Download the UniCeption format checkpoints from the AirLab Data Server
"""

import argparse
import os

from minio import Minio
from minio.error import S3Error
from tqdm import tqdm


def main():
    parser = argparse.ArgumentParser(description="Download UniCeption format checkpoints from AirLab Data Server")
    parser.add_argument(
        "--folders",
        nargs="+",
        default=["encoders", "info_sharing", "prediction_heads", "examples"],
        help="List of folders to download (default: all folders). Choices: encoders, info_sharing, prediction_heads, examples",
    )
    parser.add_argument("--destination", type=str, default="./", help="Destination folder for downloaded checkpoints")
    args = parser.parse_args()

    access_key = "bT79gQYtfhpxFIitlpns"
    secret_key = "g7mSvUJ5k2a9mKv9IbhwXmUQjQX52MLwulhW9ONO"
    client = Minio("airlab-share-02.andrew.cmu.edu:9000", access_key=access_key, secret_key=secret_key, secure=True)

    bucket_name = "uniception"

    def download_folder(folder_name, bucket_name, client, destination_folder):
        folder_name = f"checkpoints/{folder_name}/"
        objects = client.list_objects(bucket_name, prefix=folder_name, recursive=True)
        for obj in tqdm(objects, desc=f"Downloading {folder_name}"):
            destination_file = os.path.join(destination_folder, obj.object_name)
            if not os.path.exists(destination_file):
                os.makedirs(os.path.dirname(destination_file), exist_ok=True)
                try:
                    client.fget_object(bucket_name, obj.object_name, destination_file)
                    print(f"Downloaded {obj.object_name} to {destination_file}")
                except S3Error as e:
                    print(f"Error downloading {obj.object_name}: {e}")
            else:
                print(f"File {destination_file} already exists. Skipping...")

    for folder in args.folders:
        download_folder(folder, bucket_name, client, args.destination)


if __name__ == "__main__":
    main()
