'''
Googlecloud to SA conversion method
'''
import logging
import threading
from pathlib import Path

import cv2
import pandas as pd

from ..sa_json_helper import _create_vector_instance, _create_sa_json

from ....common import write_to_json, tqdm_converter

logger = logging.getLogger("superannotate-python-sdk")


def googlecloud_to_sa_vector(path, output_dir):
    df = pd.read_csv(path, header=None)
    dir_name = path.parent

    sa_jsons = {}
    classes = []
    images_converted = []
    images_not_converted = []
    finish_event = threading.Event()
    tqdm_thread = threading.Thread(
        target=tqdm_converter,
        args=(len(df), images_converted, images_not_converted, finish_event),
        daemon=True
    )
    logger.info('Converting to SuperAnnotate JSON format')
    tqdm_thread.start()
    for _, row in df.iterrows():
        classes.append(row[2])

        file_name = row[1].split('/')[-1]
        try:
            images_converted.append(file_name)
            img = cv2.imread(str(dir_name / file_name))
            H, W, _ = img.shape
        except Exception as e:
            logger.warning("Can't open %s image.", file_name)
            images_not_converted.append(file_name)
            continue

        sa_file_name = '%s___objects.json' % Path(file_name).name

        points = (row[3] * W, row[4] * H, row[5] * W, row[8] * H)
        sa_instances = _create_vector_instance('bbox', points, {}, [], row[2])

        if sa_file_name in sa_jsons.keys():
            sa_jsons[sa_file_name]['instances'].append(sa_instances)
        else:
            sa_metadata = {
                'name': Path(file_name).name,
                'width': W,
                'height': H
            }
            sa_jsons[sa_file_name] = {
                'metadata': sa_metadata,
                'instances': [sa_instances]
            }
    finish_event.set()
    tqdm_thread.join()

    for key, value in sa_jsons.items():
        sa_json = _create_sa_json(value['instances'], value['metadata'])
        write_to_json(output_dir / key, sa_json)

    return classes
