import tkinter as tk
from tkinter import messagebox
import ctypes
import math
import time
import threading

# ==================== 屏幕取色（Windows API） ====================
class ColorPicker:
    def __init__(self):
        self.user32 = ctypes.windll.user32
        self.gdi32 = ctypes.windll.gdi32
        self.user32.SetProcessDPIAware()

    def get_color_at(self, x, y):
        hdc = self.user32.GetDC(0)
        color = self.gdi32.GetPixel(hdc, x, y)
        self.user32.ReleaseDC(0, hdc)

        r = color & 0xFF
        g = (color >> 8) & 0xFF
        b = (color >> 16) & 0xFF
        return r, g, b


# ==================== 颜色工具函数 ====================
def rgb_to_hex(r, g, b):
    return f"#{r:02X}{g:02X}{b:02X}"


def rgb_to_hsv(r, g, b):
    r, g, b = r / 255, g / 255, b / 255
    mx = max(r, g, b)
    mn = min(r, g, b)
    df = mx - mn

    if mx == mn:
        h = 0
    elif mx == r:
        h = (60 * ((g - b) / df) + 360) % 360
    elif mx == g:
        h = (60 * ((b - r) / df) + 120) % 360
    else:
        h = (60 * ((r - g) / df) + 240) % 360

    s = 0 if mx == 0 else (df / mx) * 100
    v = mx * 100
    return round(h, 1), round(s, 1), round(v, 1)


# 常见颜色名称
COLOR_NAMES = {
    (255, 0, 0): "红色",
    (0, 255, 0): "绿色",
    (0, 0, 255): "蓝色",
    (255, 255, 0): "黄色",
    (255, 0, 255): "紫色",
    (0, 255, 255): "青色",
    (0, 0, 0): "黑色",
    (255, 255, 255): "白色",
    (128, 128, 128): "灰色",
    (192, 192, 192): "银色",
    (255, 165, 0): "橙色",
    (165, 42, 42): "棕色",
    (255, 192, 203): "粉色",
}


def get_color_name(r, g, b):
    best = "未知颜色"
    min_dist = float("inf")
    for (cr, cg, cb), name in COLOR_NAMES.items():
        dist = math.sqrt((r - cr) ** 2 + (g - cg) ** 2 + (b - cb) ** 2)
        if dist < min_dist:
            min_dist = dist
            best = name
    return best


# ==================== 主程序 ====================
class ColorRecognizerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("039. 颜色识别工具")
        self.root.geometry("460x480")
        self.root.resizable(False, False)

        self.picker = ColorPicker()
        self.picking = False

        self.build_ui()

    def build_ui(self):
        tk.Label(
            self.root, text="🎨 颜色识别工具",
            font=("微软雅黑", 18, "bold")
        ).pack(pady=10)

        # ===== 颜色预览 =====
        self.color_preview = tk.Label(
            self.root, text="", width=30, height=6,
            font=("Consolas", 12), relief=tk.RAISED, bd=3
        )
        self.color_preview.pack(pady=10)

        # ===== 信息区 =====
        info_frame = tk.LabelFrame(self.root, text="颜色信息", font=("微软雅黑", 10))
        info_frame.pack(padx=20, pady=5, fill=tk.X)

        self.rgb_label = tk.Label(info_frame, text="RGB：", font=("Consolas", 10))
        self.rgb_label.pack(anchor="w", padx=10, pady=2)

        self.hex_label = tk.Label(info_frame, text="HEX：", font=("Consolas", 10))
        self.hex_label.pack(anchor="w", padx=10, pady=2)

        self.hsv_label = tk.Label(info_frame, text="HSV：", font=("Consolas", 10))
        self.hsv_label.pack(anchor="w", padx=10, pady=2)

        self.name_label = tk.Label(
            info_frame, text="颜色名称：",
            font=("微软雅黑", 10, "bold")
        )
        self.name_label.pack(anchor="w", padx=10, pady=(2, 10))

        # ===== 按钮区 =====
        btn_frame = tk.Frame(self.root)
        btn_frame.pack(pady=10)

        self.pick_btn = tk.Button(
            btn_frame, text="🖱️ 鼠标取色",
            width=14, height=2,
            bg="#4CAF50", fg="white",
            font=("微软雅黑", 11, "bold"),
            command=self.start_pick
        )
        self.pick_btn.pack(side=tk.LEFT, padx=8)

        tk.Button(
            btn_frame, text="📋 复制 HEX",
            width=14, height=2,
            bg="#2196F3", fg="white",
            font=("微软雅黑", 11),
            command=self.copy_hex
        ).pack(side=tk.LEFT, padx=8)

        tk.Button(
            btn_frame, text="重置",
            width=10, height=2,
            bg="#FF9800", fg="white",
            font=("微软雅黑", 10),
            command=self.reset
        ).pack(side=tk.LEFT, padx=8)

        # 状态栏
        self.status = tk.Label(
            self.root, text="点击“鼠标取色”，然后在屏幕上点击",
            anchor="w", relief=tk.SUNKEN
        )
        self.status.pack(side=tk.BOTTOM, fill=tk.X)

    def start_pick(self):
        if self.picking:
            return
        self.picking = True
        self.pick_btn.config(state="disabled")
        self.status.config(text="请在屏幕上点击要取色的位置（3 秒后生效）...")
        threading.Thread(target=self.pick_color, daemon=True).start()

    def pick_color(self):
        time.sleep(3)
        x = self.picker.user32.GetCursorPos(ctypes.byref(ctypes.c_long * 2()))[0]
        y = self.picker.user32.GetCursorPos(ctypes.byref(ctypes.c_long * 2()))[1]

        r, g, b = self.picker.get_color_at(x, y)
        self.root.after(0, self.update_color, r, g, b)

    def update_color(self, r, g, b):
        hex_color = rgb_to_hex(r, g, b)
        h, s, v = rgb_to_hsv(r, g, b)
        name = get_color_name(r, g, b)

        self.color_preview.config(bg=hex_color, text=hex_color)
        self.rgb_label.config(text=f"RGB：{r}, {g}, {b}")
        self.hex_label.config(text=f"HEX：{hex_color}")
        self.hsv_label.config(text=f"HSV：{h}°, {s:.1f}%, {v:.1f}%")
        self.name_label.config(text=f"颜色名称：{name}")

        self.status.config(text=f"取色成功 @ ({x}, {y})")
        self.pick_btn.config(state="normal")
        self.picking = False

    def copy_hex(self):
        hex_text = self.hex_label.cget("text").replace("HEX：", "")
        if hex_text:
            self.root.clipboard_clear()
            self.root.clipboard_append(hex_text)
            self.status.config(text="HEX 颜色码已复制到剪贴板")
        else:
            messagebox.showwarning("提示", "暂无颜色可复制！")

    def reset(self):
        self.color_preview.config(bg="white", text="")
        self.rgb_label.config(text="RGB：")
        self.hex_label.config(text="HEX：")
        self.hsv_label.config(text="HSV：")
        self.name_label.config(text="颜色名称：")
        self.status.config(text="已重置")


if __name__ == "__main__":
    root = tk.Tk()
    ColorRecognizerApp(root)
    root.mainloop()