import io
import logging
from io import BytesIO

import cv2
import numpy as np
import urllib3
from PIL import Image, ImageDraw
from minio import Minio

from app.core.config import *
from app.service.utils.decorator import RunTime

minio_client = Minio(MINIO_URL, access_key=MINIO_ACCESS, secret_key=MINIO_SECRET, secure=MINIO_SECURE)


# 自定义 Retry 类
class CustomRetry(urllib3.Retry):
    def increment(self, method=None, url=None, response=None, error=None, **kwargs):
        # 调用父类的 increment 方法
        new_retry = super(CustomRetry, self).increment(method, url, response, error, **kwargs)
        # 打印重试信息
        logger.info(f"重试连接: {method} {url}，错误: {error}，重试次数: {self.total - new_retry.total}")
        return new_retry


logger = logging.getLogger()
timeout = urllib3.Timeout(connect=1, read=10.0)  # 连接超时 5 秒，读取超时 10 秒
http_client = urllib3.PoolManager(
    num_pools=10,  # 设置连接池大小
    maxsize=10,
    timeout=timeout,
    cert_reqs='CERT_REQUIRED',  # 需要证书验证
    retries=CustomRetry(
        total=5,
        backoff_factor=0.2,
        status_forcelist=[500, 502, 503, 504],
    ),
)


#  获取图片
@RunTime
def oss_get_image(oss_client, bucket, object_name, data_type):
    # cv2 默认全通道读取
    image_object = None
    try:
        image_data = oss_client.get_object(bucket_name=bucket, object_name=object_name)
        if data_type == "cv2":
            image_bytes = image_data.read()
            image_array = np.frombuffer(image_bytes, np.uint8)  # 转成8位无符号整型
            image_object = cv2.imdecode(image_array, cv2.IMREAD_UNCHANGED)
            if image_object.dtype == np.uint16:
                image_object = (image_object / 256).astype('uint8')
        else:
            data_bytes = BytesIO(image_data.read())
            image_object = Image.open(data_bytes)
    except Exception as e:
        logger.warning(f"{OSS} | 获取图片出现异常 ######: {e}")
    return image_object


@RunTime
def oss_upload_image(oss_client, bucket, object_name, image_bytes):
    req = None
    try:
        req = oss_client.put_object(bucket_name=bucket, object_name=object_name, data=io.BytesIO(image_bytes), length=len(image_bytes), content_type='image/png')
    except Exception as e:
        logger.warning(f"{OSS} | 上传图片出现异常 ######: {e}")
    return req


if __name__ == '__main__':
    # url = "aida-results/result_0002186a-e631-11ee-86a6-b48351119060.png"
    # url = "aida-collection-element/11523/Moodboard/f60af0d2-94c2-48f9-90ff-74b8e8a481b5.jpg"
    # url = "aida-sys-image/images/female/outwear/0628000054.jpg"
    # url = "aida-users/89/product_image/string-89.png"
    # url = "test/845046c7-4f62-4f54-a4a9-c26d49c6969335b5b3a9-d335-4871-a46c-3cc3caf07da259629dfd1f1f555a2e2a9def7e719366.png"
    # url = 'aida-users/89/relight_image/123-89.png'
    # url = 'aida-users/89/relight_image/123-89.png'
    # url = 'aida-users/89/relight_image/123-89.png'
    # url = "aida-users/89/sketchboard/female/Dress/e6724ab7-8d3f-4677-abe0-c3e42ab7af85.jpeg"
    # url = "aida-users/87/print/956614a2-7e75-4fbe-9ed0-c1831e37a2c9-4-87.png"
    # url = "aida-users/89/single_logo/123-89.png"
    url = "aida-results/result_d2577888-92d7-11f0-9cfd-e0d362103998.png"

    # url = "aida-collection-element/12148/Sketchboard/95ea577b-305b-4a62-b30a-39c0dd3ddb3f.png"
    read_type = "2"
    if read_type == "cv2":
        img = oss_get_image(oss_client=minio_client, bucket=url.split('/')[0], object_name=url[url.find('/') + 1:], data_type=read_type)
        cv2.imshow("", img)
        cv2.waitKey(0)
    else:
        img = oss_get_image(oss_client=minio_client, bucket=url.split('/')[0], object_name=url[url.find('/') + 1:], data_type=read_type)
        draw = ImageDraw.Draw(img)
        # 获取图片尺寸
        width, height = img.size
        img
        # 计算中心点坐标
        center_x = width // 2
        center_y = height // 2

        # 绘制垂直中心线（红色）
        draw.line(
            [(center_x, 0), (center_x, height)],  # 从顶部到底部的垂直线
            fill=(255, 0, 0),  # 红色 (R, G, B)
            width=2  # 线宽
        )

        img.show()
        img.save("result.png")
