import base64
import json
import requests

from io import BytesIO
import re, os
from PIL import Image
from datetime import datetime
import random


import socket
r_b64_prefix = r'^data:image/.+;base64,'

from PIL import ImageOps






def resize_keep_hw_rate(image, tar_res):
    w, h = image.size
    if w > h:
        tar_w = tar_res
        tar_h = int(tar_w * h / w)
    elif h > w:
        tar_h = tar_res
        tar_w = int(tar_h * w / h)
    else:
        tar_w = tar_res
        tar_h = tar_res
    image = image.resize((tar_w, tar_h), Image.LANCZOS)
    return image


def decode_img_from_url(url):
    import requests
    from io import BytesIO
    for _ in range(5):
        try:
            content = requests.get(url, stream=True, timeout=10).content
            img = Image.open(BytesIO(content))
            img = ImageOps.exif_transpose(img)
            break
        except Exception as e:
            print_with_datetime(f"url decode error {url} {str(e)}")
            img = None
    return img


def make_sub_file_folder(file_path):
    subdir = file_path.split(os.path.basename(file_path))[0]
    os.makedirs(subdir, exist_ok=True)


def get_random_file_name():
    timing_cur = datetime.now().timestamp() * 1000000
    timing_cur = str(int(timing_cur)) + f'-{random.randint(0,99999999)}'
    return timing_cur


def print_with_datetime(string):
    print(f'{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}: {string}', flush=True)


def b64_pil(base64Data, mode = 'RGB'):
    try:
        base64Data = re.sub(r_b64_prefix, '', base64Data)
        imgData = base64.b64decode(base64Data)
        image = Image.open(BytesIO(imgData))
    except:
        image = None
    return image


def pil_b64(pil_img, fmt='jpeg', quality=75):
    output_buffer = BytesIO()
    pil_img.save(output_buffer, format=fmt, quality=quality)
    byte_data = output_buffer.getvalue()
    base64_str = base64.b64encode(byte_data).decode('utf-8')
    if fmt == 'jpeg':
        fmt_out = 'jpg'
    else:
        fmt_out = fmt
    return f'data:image/{fmt_out};base64,' + base64_str


def get_ip():
    hostname = socket.gethostname()
    ip_address = socket.gethostbyname(hostname)
    return ip_address