import copy
import json
import argparse
import numpy
import glob
import os
from tqdm import tqdm

def Labelme2Label_Studio(labelme_dirs, project_id):
    all_label_list = []
    label_dict = {}
    data_dict = {}
    annotations_dict = {}
    result_dict = {}
    vale_dict = {}
    labelme_path = []

    for labelme_dir in labelme_dirs:
        list_path = glob.glob(labelme_dir + "/*.json")
        labelme_path.extend(list_path)
    # print(label_path)
    # 进行必要信息的json转换
    for label in tqdm(labelme_path):
        with open(label, 'r', encoding='utf-8') as f:
            info = json.load(f)
            if not info['shapes']:
                continue
            annotations_list = []  # 会把之前的也添加进来，必须重置
            result_list = []  # 同上
            width = info['imageWidth']
            height = info['imageHeight']
            result_dict['original_width'] = copy.deepcopy(width)
            result_dict['original_height'] = copy.deepcopy(height)
            result_dict['image_rotation'] = 0
            result_dict['from_name'] = 'label'
            result_dict['to_name'] = 'image'
            result_dict['type'] = 'rectanglelabels'
            result_dict['origin'] = 'manual'
            # 标注信息写入
            for shape in info['shapes']:
                # print(shape)
                # print(shape['points'][0][0])
                vale_dict['x'] = shape['points'][0][0] * 100 / copy.deepcopy(width)
                vale_dict['y'] = shape['points'][0][1] * 100 / copy.deepcopy(height)
                vale_dict['width'] = (shape['points'][1][0] - shape['points'][0][0]) * 100 / copy.deepcopy(width)
                vale_dict['height'] = (shape['points'][1][1] - shape['points'][0][1]) * 100 / copy.deepcopy(height)
                vale_dict['rotation'] = 0
                vale_dict['rectanglelabels'] = [copy.deepcopy(shape['label'])]
                result_dict['value'] = copy.deepcopy(vale_dict)
                result_list.append(copy.deepcopy(result_dict))
            annotations_dict['result'] = copy.deepcopy(result_list)
            if 'updated_by' in info:
                annotations_dict['updated_by'] = info['updated_by']
            annotations_list.append(copy.deepcopy(annotations_dict))
            label_dict['annotations'] = copy.deepcopy(annotations_list)
            data_dict['image'] = '/data/upload/' + str(project_id) + '/' + os.path.basename(info['imagePath'])
            label_dict['data'] = copy.deepcopy(data_dict)
            if 'updated_by' in info:
                label_dict['updated_by'] = info['updated_by']
            all_label_list.append(copy.deepcopy(label_dict))
        f.close()

    # print(all_label_list)
    if not all_label_list:
        print('无有效json数据')
    else:
        json.dump(all_label_list, open('project' + str(project_id) + '.json', 'w', encoding='utf-8'),
              ensure_ascii=False, indent=2)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--labelme_dirs', type=str, nargs="+", default=[])
    parser.add_argument('--project_id', type=int)
    args = parser.parse_args()

    Labelme2Label_Studio(args.labelme_dirs, args.project_id)






