# https://openrgb.org/
# https://t.me/ZGQinc

import time
import os
import sys

# 连接OpenRGB SDK服务器的主机和端口
ORGB_HOST = '127.0.0.1'
ORGB_PORT = 6742

# 图片文件夹路径(PNG ; e.g. 0.png 1.png 2.png etc.)
IMAGE_FOLDER = 'image'

# 设备名称(运行脚本后根据打印的列表来确认和修改)
DEVICE_NAME = "ASUS TUF GAMING B850M-PLUS"
ZONE_NAME = "Aura Addressable 3"

# 灯带上的LED灯珠数量
NUM_LEDS = 12

# 播放的帧率(每秒的图片数)
FRAME_RATE = 15

def get_device_by_name(client, name):
    for device in client.devices:
        if name.lower() in device.name.lower():
            return device
    return None

def get_zone_by_name(device, name):
    for zone in device.zones:
        if name.lower() in zone.name.lower():
            return zone
    return None

def image_to_led_colors(image_path, num_leds):
    try:
        from PIL import Image
    except ImportError:
        print("错误: Pillow 库未安装。请运行 'pip install Pillow'")
        sys.exit(1)

    try:
        img = Image.open(image_path)
        img = img.resize((num_leds, 1), Image.Resampling.LANCZOS)
        img = img.convert('RGB')
        pixels = list(img.getdata())
        from openrgb.utils import RGBColor
        return [RGBColor(r, g, b) for r, g, b in pixels]
    except FileNotFoundError:
        return None

def main():
    try:
        from openrgb import OpenRGBClient
        from openrgb.utils import RGBColor
    except ImportError:
        print("错误: openrgb-python 库未安装。请运行 'pip install openrgb-python'")
        sys.exit(1)

    try:
        import cv2
    except ImportError:
        print("错误: opencv-python 库未安装。请运行 'pip install opencv-python'")
        sys.exit(1)

    client = None
    try:
        client = OpenRGBClient(ORGB_HOST, ORGB_PORT, "Python ARGB Player")

        device = get_device_by_name(client, DEVICE_NAME)
        if not device:
            print(f"错误：找不到名为 '{DEVICE_NAME}' 的设备。")
            print("可用设备列表 (DEVICE_NAME):")
            for d in client.devices:
                print(f"- {d.name}")
            sys.exit(1)
            
        print(f"成功找到设备: {device.name}")

        target_zone = get_zone_by_name(device, ZONE_NAME)
        if not target_zone:
            print(f"\n错误：在设备 '{device.name}' 中找不到包含关键字 '{ZONE_NAME}' 的区域。")
            print("设备上的可用区域 (ZONE_NAME):")
            for i, z in enumerate(device.zones):
                print(f"  [{i}] {z.name} (拥有 {len(z.leds)} 个LED)")
            sys.exit(1)

        print(f"\n成功选择区域: '{target_zone.name}'，该区域有 {len(target_zone.leds)} 个LED。")
        
        if len(target_zone.leds) != NUM_LEDS:
            print(f"警告：脚本中设置的LED数量({NUM_LEDS})与OpenRGB在该区域检测到的数量({len(target_zone.leds)})不符。")

        try:
            device.set_mode('direct')
            print("设备已设置为“直接”(Direct)控制模式。")
        except Exception as e:
            print(f"警告：无法将设备设置为“直接”模式。请在OpenRGB应用中手动设置。错误信息：{e}")

        frame_number = 0
        while True:
            image_path = os.path.join(IMAGE_FOLDER, f"{frame_number}.png")
            colors = image_to_led_colors(image_path, NUM_LEDS)

            if colors is None:
                if frame_number == 0:
                    print(f"错误：在 '{IMAGE_FOLDER}' 文件夹中找不到图片。")
                    break
                else:
                    print("视频播放完毕，从头开始。")
                    frame_number = 0
                    continue
            
            target_zone.set_colors(colors)

            frame_number += 1
            time.sleep(1 / FRAME_RATE)

    except ConnectionRefusedError:
        print("错误：无法连接到OpenRGB SDK服务器。")
    except Exception as e:
        print(f"发生错误: {e}")
    finally:
        if client:
            client.disconnect()
        print("与服务器的连接已关闭。")

if __name__ == "__main__":
    main()