# This is the the file to be run on the oracle cloud

import oci
import argparse
import os
import io
import sys
import json
import shutil
import yaml
from pathlib import Path
from oci.config import validate_config
from oci.object_storage import ObjectStorageClient


def run_oracle_wrapper(path_to_config_file):
    # read the config file with the credentials with json format
    with open('login_oracle_config.json') as f:
        config = json.load(f)

    # validate the config file
    validate_config(config)

    # create the client
    client = ObjectStorageClient(config)

    # get the namespace
    namespace = client.get_namespace().data

    # get the bucket name
    bucket_name = 'bucket_lidar_data'

    # get the object name
    object_name = './geoslam/plot72_tile_-25_-25.las'

    # get the object
    file = client.get_object(namespace, bucket_name, object_name)

    # write the object to a file
    with open('plot_from_bucket.las', 'wb') as f:
        for chunk in file.data.raw.stream(1024 * 1024, decode_content=False):
            f.write(chunk)


   # read the config file from config folder
    with open(path_to_config_file) as f:
        config_flow_params = yaml.load(f, Loader=yaml.FullLoader)

    # create the input folder if it does not exist
    if not os.path.exists(config_flow_params['general']['input_folder']):
        os.mkdir(config_flow_params['general']['input_folder'])

    # move the file to the input folder using shutil if it does not exist
    if not os.path.exists(config_flow_params['general']['input_folder'] + '/plot_from_bucket.las'):
        shutil.move('plot_from_bucket.las', config_flow_params['general']['input_folder'])


    from run import main

    # run the main function
    main(path_to_config_file)

    # get list of files in the output folder
    list_of_files = os.listdir(config_flow_params['general']['output_folder'])

    # save files to the output bucket 'bucket_lidar_data' in the subfolder 'output'
    for file in list_of_files:
        # get the full path of the file
        path_to_file = config_flow_params['general']['output_folder'] + '/' + file

        # get the file name
        file_name = file

        # upload the file to the bucket
        client.put_object(namespace, bucket_name, 'output/' + file_name, io.open(path_to_file, 'rb'))

if __name__ == '__main__':
    # use argparse to get the path to the config file
    parser = argparse.ArgumentParser()
    parser.add_argument("--path_to_config_file", type=str, default="./config/config.yaml")
    args = parser.parse_args()

    # run the main function
    run_oracle_wrapper(args.path_to_config_file)