import os
import sys
import cv2
import json
import random
import time
import requests
import func_timeout
import numpy as np
import gradio as gr


OssUrl = "https://selfit-deploy-1256039085.cos.accelerate.myqcloud.com/"
Regions = "IndiaPakistanBengal"
TOKEN = os.environ['TOKEN']
UKAPIURL = os.environ['UKAPIURL']


proj_dir = os.path.dirname(os.path.abspath(__file__))
data_dir = os.path.join(proj_dir, 'Datas')
# data_dir = "Datas"
tmpFolder = "tmp"
os.makedirs(tmpFolder, exist_ok=True)


def get_cloth_examples(hr=0):
    cloth_dir = os.path.join(data_dir, 'ClothImgs')
    examples = []
    files = sorted(os.listdir(cloth_dir))
    hr_clothes = list(range(588, 597))
    # hr_clothes = []
    for f in files:
        if '.jpg' not in f and '.png' not in f:
            continue

        cloth_id = f.split(".")[0]
        if int(cloth_id) in hr_clothes and hr==0:
            continue
        if int(cloth_id) not in hr_clothes and hr==1:
            continue

        cloth_path = os.path.join(cloth_dir, f)
        examples.append(cloth_path)
    examples = examples[::-1]
    return examples

def get_pose_examples():
    pose_dir = os.path.join(data_dir, 'PoseImgs')
    examples = []
    for f in os.listdir(pose_dir):
        if '.jpg' not in f and '.png' not in f:
            continue
        pose_id = f.split(".")[0]
        pose_path = os.path.join(pose_dir, f)
        examples.append(pose_path)
    return examples

def get_result_example(cloth_id, pose_id):
    result_dir = os.path.join(data_dir, 'ResultImgs')
    res_path = os.path.join(result_dir, f"{cloth_id}_{pose_id}.jpg")
    return res_path

def get_tips():
    path1 = OssUrl+'ClothData/Publics/PoseGuide/tip1.jpg'
    path2 = OssUrl+'ClothData/Publics/PoseGuide/tip2.jpg'
    return path1, path2

def upload_pose_img(clientIp, timeId, img):
    fileName = clientIp.replace(".", "")+str(timeId)+".jpg"
    local_path = os.path.join(tmpFolder, fileName)
    img = cv2.imread(img)
    cv2.imwrite(os.path.join(tmpFolder, fileName), img)

    json_data = {
        "token": "c0e69e5d129b11efa10c525400b75156",  
        "input1": fileName,
        "input2": "",
        "protocol": "",
        "cloud": "ali"
    }
    
    session = requests.session()
    ret = requests.post(
        f"{UKAPIURL}/upload",
        headers={'Content-Type': 'application/json'},
        json=json_data
    )
    
    res = ""
    if ret.status_code==200:
        if 'upload1' in ret.json():
            upload_url = ret.json()['upload1']
            headers = {'Content-Type': 'image/jpeg'}
            response = session.put(upload_url, data=open(local_path, 'rb').read(), headers=headers)
            # print(response.status_code)
            if response.status_code == 200:
                res = upload_url
    if os.path.exists(local_path):
        os.remove(local_path)
    return res


def publicClothSwap(image, clothId, is_hr=0):
    json_data = {
        "image": image,
        "task_type": "11", 
        "param1": str(clothId),
        "param2": "",
        "param3": "",
        "param4": str(is_hr),
        "delete_if_complete": "1",
        "force_celery":"1"
    }
    
    headers = {
        'Authorization': f'Bearer {TOKEN}',
        'Content-Type': 'application/json'
    }
    
    ret = requests.post(
        f'{UKAPIURL}/public_advton',
        headers=headers,
        json=json_data
    )
    
    if ret.status_code == 200:
        response = ret.json()
        if 'mid_result' in response and 'id' in response:
            return {'mid_result': response['mid_result'], 'id': response['id'], "msg": response['msg']}
        # print(response)
        return None
    else:
        return None

def getInfRes(taskId):
    headers = {
        'Content-Type': 'application/json'
    }
    json_data = {
        'id': taskId
    }
    ret = requests.post(
        f'{UKAPIURL}/status_advton',
        headers=headers,
        json=json_data
    )
    if ret.status_code == 200:
        response = ret.json()
        if 'status' in response:
            return response
        print(response)
        return None
    else:
        return None

@func_timeout.func_set_timeout(10)
def check_region(ip):
    session = requests.session()
    # ret = requests.get(f"https://api.ip2location.io/?ip={ip}")
    ret = requests.get(f"https://realip.cc/?ip={ip}")
    # print(ret)
    nat = ret.json()['country'].lower()
    if nat in Regions.lower():
        print(nat, 'invalid')
        return False
    else:
        print(nat, 'valid')
    return True


def check_region_warp(ip):
    try:
        return check_region(ip)
    except Exception as e:
        print(e)
        return True