import multiprocessing as mp
import sys
import time
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor, wait, ALL_COMPLETED
from multiprocessing import Queue

import cv2
import tensorrt as trt
sys.path.extend(['/home/th/tuo_heng/dev/tuoheng_alg', '/home/th/tuo_heng/dev/tuoheng_alg/util'])
from util.PlotsUtils import get_label_arrays
from util.TorchUtils import select_device

sys.path.extend(['/home/th/tuo_heng/', '/home/th/tuo_heng/dev', '/home/th/tuo_heng/dev/AIlib2', '/home/th/tuo_heng/dev/AIlib2/segutils'])
from segutils.segmodel import SegModel
from models.experimental import attempt_load
from AI import AI_process
from utilsK.queRiver import riverDetSegMixProcess

COLOR = (
    [0, 0, 255],
    [255, 0, 0],
    [211, 0, 148],
    [0, 127, 0],
    [0, 69, 255],
    [0, 255, 0],
    [255, 0, 255],
    [0, 0, 127],
    [127, 0, 255],
    [255, 129, 0],
    [139, 139, 0],
    [255, 255, 0],
    [127, 255, 0],
    [0, 127, 255],
    [0, 255, 127],
    [255, 127, 255],
    [8, 101, 139],
    [171, 130, 255],
    [139, 112, 74],
    [205, 205, 180])
par = {
    'device': '0',
    'labelnames': ["排口", "水生植被", "其它", "漂浮物", "污染排口", "菜地", "违建", "岸坡垃圾"],
    'seg_nclass': 2,
    'trtFlag_seg': True,
    'trtFlag_det': True,
    'segRegionCnt': 1,
    'segPar': {
        'modelSize': (640, 360),
        'mean': (0.485, 0.456, 0.406),
        'std': (0.229, 0.224, 0.225),
        'numpy': False,
        'RGB_convert_first': True,
        'mixFunction': {
            'function': riverDetSegMixProcess,
            'pars': {
                'slopeIndex': [5, 6, 7],
                'riverIou': 0.1
            }
        }
    },
    'postFile': {
        "name": "post_process",
        "conf_thres": 0.25,
        "iou_thres": 0.45,
        "classes": 5,
        "rainbows": COLOR
    },
    'Detweights': "/home/th/tuo_heng/dev/AIlib2/weights/river/yolov5_2080Ti_fp16.engine",
    'Segweights': '/home/th/tuo_heng/dev/AIlib2/weights/river/stdc_360X640_2080Ti_fp16.engine'
}
mode, postPar, segPar = par.get('mode', 'others'), par.get('postPar'), par.get('segPar')
new_device = select_device(par.get('device'))
names = par['labelnames']
half = new_device.type != 'cpu'
Detweights = par['Detweights']
with open(Detweights, "rb") as f, trt.Runtime(trt.Logger(trt.Logger.ERROR)) as runtime:
    model = runtime.deserialize_cuda_engine(f.read())
Segweights = par['Segweights']
if Segweights:
    with open(Segweights, "rb") as f, trt.Runtime(trt.Logger(trt.Logger.ERROR)) as runtime:
        segmodel = runtime.deserialize_cuda_engine(f.read())
else:
    segmodel = None
postFile = par['postFile']
rainbows = postFile["rainbows"]
objectPar = {
    'half': half,
    'device': new_device,
    'conf_thres': postFile["conf_thres"],
    'ovlap_thres_crossCategory': postFile.get("ovlap_thres_crossCategory"),
    'iou_thres': postFile["iou_thres"],
    'allowedList': [],
    'segRegionCnt': par['segRegionCnt'],
    'trtFlag_det': par['trtFlag_det'],
    'trtFlag_seg': par['trtFlag_seg']
}
Detweights = "/home/th/tuo_heng/dev/AIlib2/weights/river2/yolov5_2080Ti_fp16.engine"
with open(Detweights, "rb") as f, trt.Runtime(trt.Logger(trt.Logger.ERROR)) as runtime:
    model = runtime.deserialize_cuda_engine(f.read())
Segweights = "/home/th/tuo_heng/dev/AIlib2/weights/river2/stdc_360X640_2080Ti_fp16.engine"
with open(Segweights, "rb") as f, trt.Runtime(trt.Logger(trt.Logger.ERROR)) as runtime:
    segmodel = runtime.deserialize_cuda_engine(f.read())


allowedList = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]



def one_label(width, height, model_param):
    names = model_param[4]
    rainbows = model_param[6]
    digitFont, label_arraylist, font_config = get_label_arraylist(width, height, names, rainbows)
    """
    font_config, frame, model, segmodel, names, label_arraylist, rainbows, objectPar, font, segPar, mode, postPar, 
    requestId
    """
    model_param[5] = label_arraylist
    model_param[8] = digitFont
    model_param[0] = font_config


def get_label_arraylist(*args):
    width, height, names, rainbows = args
    # line = int(round(0.002 * (height + width) / 2) + 1)
    line = int(width / 1920 * 3 - 1)
    label = ' 0.95'
    tf = max(line, 1)
    fontScale = line * 0.33
    text_width, text_height = cv2.getTextSize(label, 0, fontScale=fontScale, thickness=tf)[0]
    fontsize = int(width / 1920 * 40)
    numFontSize = float(format(width / 1920 * 1.1, '.1f'))
    digitFont = {'line_thickness': line,
                 'boxLine_thickness': line,
                 'fontSize': numFontSize,
                 'waterLineColor': (0, 255, 255),
                 'segLineShow': False,
                 'waterLineWidth': line}
    label_arraylist = get_label_arrays(names, rainbows, text_height, fontSize=fontsize,
                                       fontPath="/home/th/tuo_heng/dev/AIlib2/conf/platech.ttf")
    return digitFont, label_arraylist, (line, text_width, text_height, fontScale, tf)
image = cv2.imread("/home/th/tuo_heng/dev/ompv2fn94m_1687259193110.jpg")
start_time1 = time.time()
with ThreadPoolExecutor(max_workers=3) as t:
    rs = []
    for i in range(500):
        rr = t.submit(AI_process, [image], model, segmodel, names, None, rainbows, objectPar=objectPar,
                      font={'line_thickness': 1,
                            'boxLine_thickness': 1,
                            'fontSize': 1.1,
                            'waterLineColor': (0, 255, 255),
                            'segLineShow': False,
                            'waterLineWidth': 1}, segPar=segPar, mode=mode, postPar=postPar)
        rs.append(rr)
    for i in rs:
        i.result()
print(time.time() - start_time1)

start_time = time.time()
for i in range(500):
    AI_process([image], model, segmodel, names, None, rainbows, objectPar=objectPar,
               font={'line_thickness': 1,
                     'boxLine_thickness': 1,
                     'fontSize': 1.1,
                     'waterLineColor': (0, 255, 255),
                     'segLineShow': False,
                     'waterLineWidth': 1}, segPar=segPar, mode=mode, postPar=postPar)
print(time.time() - start_time)
