import cv2
import numpy as np
import os, requests
from io import BytesIO


def add_drop_shadow(url):
    response = requests.get(url, stream=True).raw
    image = np.asarray(bytearray(response.read()), dtype="uint8")
    rmbga = cv2.imdecode(image, -1)
    mask = rmbga[:, :, 3].copy()
    contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2:]
    contour = sorted(contours, reverse=True, key=cv2.contourArea)[0]
    M = cv2.moments(contour)
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"]) + 10

    hull = cv2.convexHull(contour, False)
    drawing = np.zeros_like(mask)
    mask_cpy = cv2.drawContours(drawing, [hull], 0, 180, -1)

    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (17, 17))
    mask_cpy = cv2.erode(mask_cpy, kernel, iterations=3)  # dilate
    mask_cpy = cv2.blur(mask_cpy, (15, 15))  # 21
    mask_cpy[:cY, :] = 0

    inter_mask = mask[cY:, :]
    inter_mask_cpy = mask_cpy[cY:, :]
    inter_rmbga = rmbga[cY:, :]

    inter_mask_cpy[np.where(((inter_mask != 0) & (inter_mask_cpy > 0)))] = 0
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    inter_mask_cpy = cv2.dilate(inter_mask_cpy, kernel, iterations=2)
    inter_mask_cpy = cv2.medianBlur(inter_mask_cpy, 5)

    inter_mask[np.where(((inter_mask < 255) & (inter_mask_cpy > 0)))] = inter_mask_cpy[np.where(((inter_mask < 255) & (inter_mask_cpy > 0)))]
    inter_rmbga[np.where(((inter_mask < 255) & (inter_mask_cpy > 0)))] = 0
    # inter_mask[np.where(((inter_mask==0) & (inter_mask_cpy >0)))]=inter_mask_cpy[np.where(((inter_mask==0) & (inter_mask_cpy >0)))]

    # dilate and then erode
    #     mask = cv2.dilate(mask,kernel,iterations = 5)
    #     mask = cv2.erode(mask,kernel,iterations = 5)
    #     mask = cv2.medianBlur(mask,5)
    #mask[cY:, :] = cv2.blur(mask[cY:, :], (7, 7))

    rmbga[:, :, 3] = mask
    rmbga_path = os.path.basename(url).split('.')[0] + '_shadow.png'
    cv2.imwrite(rmbga_path, rmbga)
    return rmbga_path


'''
if __name__ == '__main__':
    path = add_drop_shadow(
        "https://gcbimages.storage.googleapis.com/segmentation_images/api_segementation/6445084F-E913-FEC5-AF0E-507688C8DB7E/6445084F-E913-FEC5-AF0E-507688C8DB7E_revised_final_image.png")
    path = add_drop_shadow(
        "https://gcbimages.storage.googleapis.com/segmentation_images/api_segementation/722389B4-569D-6E58-3B2E-D949CED38BA2/722389B4-569D-6E58-3B2E-D949CED38BA2_revised_final_image.png")
    path = add_drop_shadow(
        "https://gcbimages.storage.googleapis.com/segmentation_images/api_segementation/12F8DCEE-8785-9DC2-1D38-C5FD4ADCAA9B/12F8DCEE-8785-9DC2-1D38-C5FD4ADCAA9B_revised_final_image.png")
    path = add_drop_shadow(
        "https://gcbimages.storage.googleapis.com/segmentation_images/api_segementation/B1B8D028-006D-86DD-7F56-2BC8C9C84CFE/B1B8D028-006D-86DD-7F56-2BC8C9C84CFE_revised_no-bg.png")
'''
