# ClearML - Example of manual graphs and  statistics reporting
#
import os

import numpy as np
from PIL import Image

from clearml import Task, Logger


def report_debug_images(logger, iteration=0):
    # type: (Logger, int) -> ()
    """
    reporting images to debug samples section
    :param logger: The task.logger to use for sending the plots
    :param iteration: The iteration number of the current reports
    """

    # report image as float image
    m = np.eye(256, 256, dtype=float)
    logger.report_image("image", "image float", iteration=iteration, image=m)

    # report image as uint8
    m = np.eye(256, 256, dtype=np.uint8) * 255
    logger.report_image("image", "image uint8", iteration=iteration, image=m)

    # report image as uint8 RGB
    m = np.concatenate((np.atleast_3d(m), np.zeros((256, 256, 2), dtype=np.uint8)), axis=2)
    logger.report_image("image", "image color red", iteration=iteration, image=m)

    # report PIL Image object
    image_open = Image.open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "data_samples", "picasso.jpg"))
    logger.report_image("image", "image PIL", iteration=iteration, image=image_open)

    # Image can be uploaded via 'report_media' too.
    logger.report_media(
        "image",
        "image with report media",
        iteration=iteration,
        local_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "data_samples", "picasso.jpg"),
        file_extension="jpg",
    )


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

    print('reporting a few debug images')

    # Get the task logger,
    # You can also call Task.current_task().get_logger() from anywhere in your code.
    logger = task.get_logger()

    # report debug images
    report_debug_images(logger)

    # force flush reports
    # If flush is not called, reports are flushed in the background every couple of seconds,
    # and at the end of the process execution
    logger.flush()

    print('We are done reporting, have a great day :)')


if __name__ == "__main__":
    main()