"""
步骤：
1、整理需要处理的款号图-输出款号图文件夹
2、整理所有相关的图片作为素材图
3、按要求进行拼接
"""

import os
import time
from PIL import Image, ImageFont
import sys
import settings
import requests
import json, base64, io

# from module.view_control.generate_goods_no_detail_pic.detail_generate_base import DetailBase
# from module.view_control.generate_goods_no_detail_pic.pic_deal import PictureProcessing
is_test_plugins = False
try:
    is_test_plugins = settings.is_test_plugins
except:
    is_test_plugins = False

if is_test_plugins:
    from custom_plugins.plugins_mode.detail_generate_base import DetailBase
    from custom_plugins.plugins_mode.pic_deal import PictureProcessing
else:
    from plugins_mode.detail_generate_base import DetailBase
    from plugins_mode.pic_deal import PictureProcessing


plugins_name = "详情模板"
company_name_list = ["全部"]
template_name = "huilima-4"


def download_image_pil(url):
    yzmdata = requests.get(url)
    tempIm = io.BytesIO(yzmdata.content)
    im = Image.open(tempIm)
    return im


# 乐福鞋 详情页


class DetailPicGet(DetailBase):
    need_view = ["俯视", "侧视", "后跟", "鞋底", "内里"]
    root = r"{}\resources\detail_temp\huilima\4".format(os.getcwd())

    def __init__(
        self,
        goods_no,
        goods_no_value: dict,
        out_put_dir,
        windows=None,
        test=False,
        excel_data=None,
        assigned_page_list=None,
        output_queue=None,
        **kwargs,
    ):

        super().__init__(
            goods_no,
            goods_no_value,
            out_put_dir,
            windows=windows,
            excel_data=excel_data,
            assigned_page_list=assigned_page_list,
            output_queue=output_queue,
        )

        self.template_name = template_name
        self.root = r"{}\resources\detail_temp\huilima\4".format(os.getcwd())
        print("run huilima-1 ")
        self.base_bg_color = (255, 255, 255)
        self.deal_pic_func_list = [
            self.deal_pic_1,
            self.deal_pic_2,
            self.deal_pic_3,
            self.deal_pic_7,
            self.deal_pic_4,
            self.deal_pic_5,
            self.deal_pic_6,
        ]
        if test:
            self.run_test()
        else:
            self.run_all()

    def run_test(self):
        detailed_images = []
        detailed_images.append(self.deal_pic_1())
        detailed_images.append(self.deal_pic_2())
        detailed_images.append(self.deal_pic_3())
        detailed_images.append(self.deal_pic_7())
        detailed_images.append(self.deal_pic_4())
        detailed_images.append(self.deal_pic_5())
        detailed_images.append(self.deal_pic_6())
        img = self.add_pic(detailed_images)
        if img:
            self.create_folder(r"{}/{}".format(self.out_put_dir, template_name))
            img.save(
                r"{}/{}/{}.jpg".format(
                    self.out_put_dir, template_name, self.goods_no, format="JPEG"
                )
            )
            img.show()

    #
    def deal_pic_1(self):
        detailed_images = []
        pp_bg_1 = PictureProcessing(r"{}\1.jpg".format(self.root))
        font_1 = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 120)
        text_list = [
            {"text": "标题", "pos": (89, 224)},
            {"text": "副标题", "pos": (89, 345)},
        ]
        for text_data in text_list:
            text = self.get_text_value(text_data["text"])
            if text:
                _pp = PictureProcessing().get_text_image_advanced(
                    font=font_1,
                    text=text,
                    fill=(0, 0, 0),
                    return_mode="min_image",
                )
                pp_bg_1 = pp_bg_1.paste_img(
                    top_img=_pp, value=text_data["pos"], base="nw"
                )
        detailed_images.append(pp_bg_1)

        # 粘贴组合图
        goods_art_no_list = list(self.data.keys())
        pp_jpg, pp_png = self.image_one_pic(
            return_orign=True,
            goods_art_no=goods_art_no_list[0],
            name="组合",
        )
        if not pp_jpg:
            pp_jpg, pp_png = self.image_one_pic(
                return_orign=True,
                goods_art_no=goods_art_no_list[0],
                name="俯视",
            )
        pp_jpg: PictureProcessing
        pp_png: PictureProcessing
        pp_jpg = pp_jpg.resize(value=1405)
        pp_png = pp_png.resize(value=1405)
        pp_bg_2 = PictureProcessing(r"{}\2.jpg".format(self.root))
        pp_bg_2 = pp_bg_2.to_overlay_pic_advance(
            top_img=pp_jpg, top_png_img=pp_png, base="cc"
        )

        detailed_images.append(pp_bg_2)
        return PictureProcessing(im=self.add_pic(detailed_images))

    # 展示基础信息
    def deal_pic_2(self):
        detailed_images = []
        detailed_images.append(PictureProcessing(r"{}\3.jpg".format(self.root)))
        # 粘贴侧视图
        goods_art_no_list = list(self.data.keys())

        pp_jpg = self.get_overlay_pic_from_dict(
            goods_art_no=goods_art_no_list[0],
            color_name="侧视",
            bg_color=self.base_bg_color,
        )
        pp_jpg = pp_jpg.resize(value=1098)
        pp_jpg = pp_jpg.paste_img_invert(
            top_img=PictureProcessing(
                "RGB", (1600, pp_jpg.height + 100), self.base_bg_color
            ),
            base="cc",
        )
        detailed_images.append(pp_jpg)
        # 粘贴基础信息
        pp_bg_2 = PictureProcessing(r"{}\5.jpg".format(self.root))
        font_1 = ImageFont.truetype(r"resources\ttf\puhui\Regular.ttf", 62)
        text_list = [
            {"text": "鞋面材质", "pos": (767, 176)},
            {"text": "内里材质", "pos": (1213, 176)},
            {"text": "鞋底材质", "pos": (767, 345)},
            {"text": "鞋垫材质", "pos": (1213, 345)},
            {"text": "跟高", "pos": (767, 616)},
            {"text": "前底厚度", "pos": (1196, 616)},
        ]
        for text_data in text_list:
            text = self.get_text_value(text_data["text"])
            if text:
                _pp = PictureProcessing().get_text_image_advanced(
                    font=font_1,
                    text=text,
                    fill=(0, 0, 0),
                    return_mode="min_image",
                )
                pp_bg_2 = pp_bg_2.paste_img(
                    top_img=_pp, value=text_data["pos"], base="nw"
                )
        detailed_images.append(pp_bg_2)

        return PictureProcessing(im=self.add_pic(detailed_images))

    # 颜色展示
    def deal_pic_3(self):
        detailed_images = []
        font_1 = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 34)  # 颜色名称
        color_pic_list_1 = []
        for goods_art_no_dict in self.goods_no_value["货号资料"]:
            color_name = goods_art_no_dict["颜色名称"]
            goods_art_no = goods_art_no_dict["货号"]
            pp_jpg = self.get_overlay_pic_from_dict(
                goods_art_no=goods_art_no,
                color_name="侧视",
                bg_color=self.base_bg_color,
            )
            pp_jpg = pp_jpg.resize(value=390)

            pp_jpg = pp_jpg.paste_img_invert(
                top_img=PictureProcessing(
                    "RGBA", (pp_jpg.width, pp_jpg.height + 70), (255, 255, 255, 0)
                ),
                base="nw",
            )
            text_image = PictureProcessing().get_text_image_advanced(
                font=font_1,
                text="{} / COLOR".format(color_name),
                fill=(0, 0, 0),
                return_mode="min_image",
            )

            pp_jpg = pp_jpg.paste_img(top_img=text_image, base="sc", value=(0, 10))
            color_pic_list_1.append(pp_jpg)

        # 颜色列表进行等分展示
        all_color_pp = PictureProcessing().horizontal_distribution(
            color_pic_list_1, bg_width=1114, line_spacing=10, number_per_row=2
        )
        all_color_pp = all_color_pp.paste_img_invert(
            top_img=PictureProcessing(
                "RGB", (1600, all_color_pp.height + 100), self.base_bg_color
            ),
            base="cc",
            value=(0, 0),
        )
        detailed_images.append(all_color_pp)
        return PictureProcessing(im=self.add_pic(detailed_images))

    def deal_pic_7(self):
        detailed_images = []
        temp_bg = PictureProcessing(r"{}\8.jpg".format(self.root))
        # temp_bg.width
        font_1 = ImageFont.truetype(r"resources\ttf\puhui\Bold.ttf", 68)  # 颜色名称
        goods_art_no_list = list(self.data.keys())
        pp_jpg = self.get_overlay_pic_from_dict(
            goods_art_no=goods_art_no_list[0],
            color_name="俯视",
            bg_color=self.base_bg_color,
        )
        # tips = "一只鞋放置在向日葵花园的草地上，鞋子后面有一块石头，石头上还有一只小猫，鞋得前面还有一条小溪，这就要求鞋子的角度、材质、纹理保持不变，背景要求富有创意且有真实感"
        tips = "The shoes are placed on a light green background.The sun shines from one side, creating a soft shadow effect, and the overall style is fresh and natural, suitable for summer wear. Keep the texture and material of this shoe intact"
        imageGenerateResult = self.getAiGenerateScenes(image_path=pp_jpg.im, tips=tips)
        if imageGenerateResult == None:
            return PictureProcessing(im=self.add_pic(detailed_images))
        imageGenerateResult = imageGenerateResult.resize(value=temp_bg.width)
        imageGenerateResult = imageGenerateResult.radius(
            value=30, circular_pos=(1, 1, 1, 1)
        )
        real_bg = PictureProcessing("RGB", (temp_bg.width, 500), self.base_bg_color)
        text_image = PictureProcessing().get_text_image_advanced(
            font=font_1,
            text="场景展示",
            fill=(0, 0, 0),
            return_mode="min_image",
        )

        real_bg = real_bg.paste_img(top_img=text_image, base="cc", value=(0, 100))
        detailed_images.append(real_bg)
        detailed_images.append(imageGenerateResult)
        detailed_images.append(
            PictureProcessing("RGB", (temp_bg.width, 300), self.base_bg_color)
        )
        return PictureProcessing(im=self.add_pic(detailed_images))

    def getAiGenerateScenes(self, image_path: Image, tips: str = ""):
        byte_io = io.BytesIO()
        # 将图片保存到BytesIO对象中，格式与原图相同
        image_path.save(byte_io, format="JPEG")
        # 获取BytesIO对象中的二进制数据
        image_data = byte_io.getvalue()

        # 使用base64编码将二进制数据转换成Base64字符串
        encoded_string = base64.b64encode(image_data).decode("utf-8")
        url = "https://api.bfl.ai/v1/flux-kontext-max"
        headers = {
            "x-key": "70f91c34-e494-4dc2-a7d2-635295136d2d",
            "Content-Type": "application/json",
        }
        payload = json.dumps(
            {
                "prompt": tips,
                "input_image": f"data:image/png;base64,{encoded_string}",
                "output_format": "jpeg",
                "aspect_ratio": "9:12",
                "safety_tolerance": 2,
            }
        )
        try:
            response = requests.request("POST", url, headers=headers, data=payload)
            response.raise_for_status()
            response_json = response.json()
            polling_url = response_json.get("polling_url")
            if polling_url == None:
                return None
            request_times = 30
            result_image = None
            i = 0
            while i < request_times:
                response_get = requests.request("GET", polling_url)
                response_get.raise_for_status()
                response_get_json = response_get.json()
                print("获取图片中...", i + 1, "次")
                print("json数据...", response_get_json)
                status = response_get_json.get("status")
                if status != "Ready":
                    time.sleep(1)
                    i += 1
                    continue
                result_image = response_get_json.get("result").get("sample")
                if result_image != None:
                    image_obj = download_image_pil(result_image)
                    print("图片获取成功...")
                    return PictureProcessing(im=image_obj)
                time.sleep(1)
                i += 1

        except:
            return None

    # 展示细节图
    def deal_pic_4(self):
        detailed_images = []
        detailed_images.append(PictureProcessing(r"{}\8.jpg".format(self.root)))

        goods_art_no_list = list(self.data.keys())
        goods_art_no = goods_art_no_list[0]
        font_1 = ImageFont.truetype(r"resources\ttf\puhui\Medium.ttf", 85)  # 颜色名称

        view_data_list = ["俯视", "俯视", "侧视"]
        text_list = ["提示1主标题", "提示2主标题", "提示3主标题"]
        bg_name_list = ["10.jpg", "12.jpg", "14.jpg"]
        for index, view_name in enumerate(view_data_list):
            pp_jpg = self.get_overlay_pic_from_dict(
                goods_art_no=goods_art_no,
                color_name=view_name,
                bg_color=(246, 246, 246),
            )
            if index == 0:
                resize_value = 3200
                paste_base = "cc"
                paste_value = (0, 200)
            if index == 1:
                resize_value = 3200
                paste_base = "ne"
                paste_value = (-100, 0)
            if index == 2:
                pp_jpg = pp_jpg.transpose(mode="left_right")
                resize_value = 3513
                paste_base = "sw"
                paste_value = (0, 100)

            pp_jpg = pp_jpg.resize(value=resize_value)
            pp_jpg = pp_jpg.paste_img_invert(
                top_img=PictureProcessing("RGB", (1500, 1500), (246, 246, 246)),
                base=paste_base,
                value=paste_value,
            )
            pp_jpg = pp_jpg.radius(value=100)
            pp_jpg = pp_jpg.paste_img_invert(
                top_img=PictureProcessing("RGB", (1600, 1600), (255, 255, 255)),
                base="cc",
            )
            detailed_images.append(pp_jpg)
            # 添加文字
            text = self.get_text_value(text_list[index])
            if text:
                pp_text_bg = PictureProcessing(
                    r"{}\{}".format(self.root, bg_name_list[index])
                )
                _pp = PictureProcessing().get_text_image_advanced(
                    font=font_1,
                    text=text,
                    fill=(0, 0, 0),
                    return_mode="min_image",
                )
                pp_text_bg = pp_text_bg.paste_img(top_img=_pp, value=(73, 0), base="wc")
                detailed_images.append(pp_text_bg)

        return PictureProcessing(im=self.add_pic(detailed_images))

    # 场景图--产品展示
    def deal_pic_5(self):
        detailed_images = []
        detailed_images.append(PictureProcessing(r"{}\15.jpg".format(self.root)))

        goods_art_no_list = list(self.data.keys())
        goods_art_no = goods_art_no_list[0]

        _flag = True
        pp_jpg = self.get_overlay_pic_from_dict(
            goods_art_no=goods_art_no, color_name="组合1", bg_color=(255, 255, 255)
        )
        if pp_jpg:
            pp_jpg = pp_jpg.paste_img_invert(
                top_img=PictureProcessing(
                    "RGB", (1600, pp_jpg.height + 200), (255, 255, 255)
                ),
                base="cc",
            )
            detailed_images.append(pp_jpg)
        else:
            _flag = False

        pp_jpg = self.get_overlay_pic_from_dict(
            goods_art_no=goods_art_no, color_name="组合2", bg_color=(255, 255, 255)
        )
        if pp_jpg:
            pp_jpg = pp_jpg.paste_img_invert(
                top_img=PictureProcessing(
                    "RGB", (1600, pp_jpg.height + 200), (255, 255, 255)
                ),
                base="cc",
            )
            detailed_images.append(pp_jpg)
        else:
            _flag = False

        if not _flag:
            detailed_images = []
            detailed_images.append(PictureProcessing(r"{}\15.jpg".format(self.root)))
            for goods_art_no_dict in self.goods_no_value["货号资料"]:
                color_name = goods_art_no_dict["颜色名称"]
                goods_art_no = goods_art_no_dict["货号"]
                pp_jpg = self.get_overlay_pic_from_dict(
                    goods_art_no=goods_art_no,
                    color_name="侧视",
                    bg_color=self.base_bg_color,
                )
                pp_jpg = pp_jpg.resize(value=1404)
                pp_jpg = pp_jpg.paste_img_invert(
                    top_img=PictureProcessing(
                        "RGB", (1600, pp_jpg.height + 200), (255, 255, 255)
                    ),
                    base="cc",
                )
                detailed_images.append(pp_jpg)

        return PictureProcessing(im=self.add_pic(detailed_images))

    # 添加注意事项
    def deal_pic_6(self):
        detailed_images = []
        detailed_images.append(PictureProcessing(r"{}\20.jpg".format(self.root)))
        detailed_images.append(PictureProcessing(r"{}\21.jpg".format(self.root)))
        return PictureProcessing(im=self.add_pic(detailed_images))
