#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri May 20 15:16:56 2022

@author: dinesh
"""

import json
import cv2
from PIL import Image
import numpy as np
from dateutil.parser import parse

def bb_intersection_over_union(box1, box2):
    #print(box1, box2)
    boxA = box1.copy()
    boxB = box2.copy()
    boxA[2] = boxA[0]+boxA[2]
    boxA[3] = boxA[1]+boxA[3]
    boxB[2] = boxB[0]+boxB[2]
    boxB[3] = boxB[1]+boxB[3]
    # determine the (x, y)-coordinates of the intersection rectangle
    xA = max(boxA[0], boxB[0])
    yA = max(boxA[1], boxB[1])
    xB = min(boxA[2], boxB[2])
    yB = min(boxA[3], boxB[3])

    # compute the area of intersection rectangle
    interArea = abs(max((xB - xA, 0)) * max((yB - yA), 0))
    
    if interArea == 0:
        return 0
    # compute the area of both the prediction and ground-truth
    # rectangles
    boxAArea = abs((boxA[2] - boxA[0]) * (boxA[3] - boxA[1]))
    boxBArea = abs((boxB[2] - boxB[0]) * (boxB[3] - boxB[1]))

    # compute the intersection over union by taking the intersection
    # area and dividing it by the sum of prediction + ground-truth
    # areas - the interesection area
    iou = interArea / float(boxAArea + boxBArea - interArea)
    return iou

def bb_intersection_over_union_unoccluded(box1, box2, threshold=0.01):
    #print(box1, box2)
    boxA = box1.copy()
    boxB = box2.copy()
    boxA[2] = boxA[0]+boxA[2]
    boxA[3] = boxA[1]+boxA[3]
    boxB[2] = boxB[0]+boxB[2]
    boxB[3] = boxB[1]+boxB[3]
    # determine the (x, y)-coordinates of the intersection rectangle
    xA = max(boxA[0], boxB[0])
    yA = max(boxA[1], boxB[1])
    xB = min(boxA[2], boxB[2])
    yB = min(boxA[3], boxB[3])

    # compute the area of intersection rectangle
    interArea = abs(max((xB - xA, 0)) * max((yB - yA), 0))
    
    if interArea == 0:
        return 0
    # compute the area of both the prediction and ground-truth
    # rectangles
    boxAArea = abs((boxA[2] - boxA[0]) * (boxA[3] - boxA[1]))
    boxBArea = abs((boxB[2] - boxB[0]) * (boxB[3] - boxB[1]))

    # compute the intersection over union by taking the intersection
    # area and dividing it by the sum of prediction + ground-truth
    # areas - the interesection area
    iou = interArea / float(boxAArea + boxBArea - interArea)

    #print(iou)
    # return the intersection over union value
    occlusion = False
    if iou > threshold and iou < 1:
        #print(boxA[3], boxB[3], boxB[1])
        if boxA[3] < boxB[3]:# and boxA[3] > boxB[1]:
            if boxB[2] > boxA[0]:# and boxB[2] < boxA[2]:
                #print('first', (boxB[2] - boxA[0])/(boxA[2] - boxA[0]))
                if (min(boxB[2],boxA[2]) - boxA[0])/(boxA[2] - boxA[0]) > threshold:
                    occlusion = True
                
            if boxB[0] < boxA[2]: # boxB[0] > boxA[0] and 
                #print('second', (boxA[2] - boxB[0])/(boxA[2] - boxA[0]))
                if (boxA[2] - max(boxB[0],boxA[0]))/(boxA[2] - boxA[0]) > threshold:
                    occlusion = True
        if occlusion == False:
            iou = iou*0
            #asas
    #    asas
    #iou = 0.9 #iou*0
    #print(box1, box2, iou, occlusion)
    return iou
def draw_tracks(image, tracks):
    """
    Draw on input image.

    Args:
        image (numpy.ndarray): image
        tracks (list): list of tracks to be drawn on the image.

    Returns:
        numpy.ndarray: image with the track-ids drawn on it.
    """

    for trk in tracks:

        trk_id = trk[1]
        xmin = trk[2]
        ymin = trk[3]
        width = trk[4]
        height = trk[5]

        xcentroid, ycentroid = int(xmin + 0.5*width), int(ymin + 0.5*height)

        text = "ID {}".format(trk_id)

        cv2.putText(image, text, (xcentroid - 10, ycentroid - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
        cv2.circle(image, (xcentroid, ycentroid), 4, (0, 255, 0), -1)

    return image


def draw_bboxes(image, tracks):
    """
    Draw the bounding boxes about detected objects in the image.

    Args:
        image (numpy.ndarray): Image or video frame.
        bboxes (numpy.ndarray): Bounding boxes pixel coordinates as (xmin, ymin, width, height)
        confidences (numpy.ndarray): Detection confidence or detection probability.
        class_ids (numpy.ndarray): Array containing class ids (aka label ids) of each detected object.

    Returns:
        numpy.ndarray: image with the bounding boxes drawn on it.
    """

    for trk in tracks:
        xmin = int(trk[2])
        ymin = int(trk[3])
        width = int(trk[4])
        height = int(trk[5])
        clr = (np.random.randint(0, 255), np.random.randint(0, 255), np.random.randint(0, 255))
        cv2.rectangle(image, (xmin, ymin), (xmin + width, ymin + height), clr, 2)

    return image


def num(v):
    number_as_float = float(v)
    number_as_int = int(number_as_float)
    return number_as_int if number_as_float == number_as_int else number_as_float


def parse_bbox(bbox_str):
    bbox_list = bbox_str.strip('{').strip('}').split(',')
    bbox_list = [num(elem) for elem in bbox_list]
    return bbox_list

def parse_seg(bbox_str):
    bbox_list = bbox_str.strip('{').strip('}').split(',')
    bbox_list = [num(elem) for elem in bbox_list]
    ret = bbox_list  # []
    # for i in range(0, len(bbox_list) - 1, 2):
    #     ret.append((bbox_list[i], bbox_list[i + 1]))
    return ret