import os
from time import sleep

import pandas as pd
import numpy as np
from PIL import Image
from clearml import Task


def main():
    # Connecting ClearML with the current process,
    # from here on everything is logged automatically
    task = Task.init(project_name='examples', task_name='Artifacts example')

    df = pd.DataFrame(
        {
            'num_legs': [2, 4, 8, 0],
            'num_wings': [2, 0, 0, 0],
            'num_specimen_seen': [10, 2, 1, 8]
        },
        index=['falcon', 'dog', 'spider', 'fish']
    )

    # Register Pandas object as artifact to watch
    # (it will be monitored in the background and automatically synced and uploaded)
    task.register_artifact('train', df, metadata={'counting': 'legs', 'max legs': 69})
    # change the artifact object
    df.sample(frac=0.5, replace=True, random_state=1)
    # or access it from anywhere using the Task's get_registered_artifacts()
    Task.current_task().get_registered_artifacts()['train'].sample(frac=0.5, replace=True, random_state=1)

    # add and upload pandas.DataFrame (onetime snapshot of the object)
    task.upload_artifact('Pandas', artifact_object=df)
    # add and upload local file artifact
    task.upload_artifact('local file', artifact_object=os.path.join('data_samples', 'dancing.jpg'))
    # add and upload dictionary stored as JSON)
    task.upload_artifact('dictionary', df.to_dict())
    # add and upload Numpy Object (stored as .npz file)
    task.upload_artifact('Numpy Eye', np.eye(100, 100))
    # add and upload Image (stored as .png file)
    im = Image.open(os.path.join('data_samples', 'dancing.jpg'))
    task.upload_artifact('pillow_image', im)
    # add and upload a folder, artifact_object should be the folder path
    task.upload_artifact('local folder', artifact_object=os.path.join('data_samples'))
    # add and upload a wildcard
    task.upload_artifact('wildcard jpegs', artifact_object=os.path.join('data_samples', '*.jpg'))
    # do something here
    sleep(1.)
    print(df)

    # we are done
    print('Done')


if __name__ == '__main__':
    main()