import pygame
import colorsys
import random

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("游戏 UI 配色方案生成器")
clock = pygame.time.Clock()

def hsv_to_rgb(h, s, v):
    r, g, b = colorsys.hsv_to_rgb(h / 360.0, s, v)
    return (int(r * 255), int(g * 255), int(b * 255))

def generate_ui_palette(base_hue):
    """从基准色相生成完整 UI 配色方案"""
    return {
        "primary":   hsv_to_rgb(base_hue, 0.7, 0.9),
        "secondary": hsv_to_rgb((base_hue + 30) % 360, 0.5, 0.8),
        "accent":    hsv_to_rgb((base_hue + 180) % 360, 0.8, 0.9),
        "bg_dark":   hsv_to_rgb(base_hue, 0.15, 0.15),
        "bg_light":  hsv_to_rgb(base_hue, 0.1, 0.25),
        "text":      hsv_to_rgb(base_hue, 0.05, 0.9),
        "button":    hsv_to_rgb(base_hue, 0.6, 0.85),
        "button_hover": hsv_to_rgb(base_hue, 0.7, 0.95),
    }

# 初始方案
base_hue = 200
palette = generate_ui_palette(base_hue)

font = pygame.font.SysFont("microsoft yahei", 18)
title_font = pygame.font.SysFont("microsoft yahei", 28)

def draw_ui_demo(palette):
    """用当前配色画一个假 UI 界面"""
    # 背景
    screen.fill(palette["bg_dark"])

    # 顶部栏
    pygame.draw.rect(screen, palette["bg_light"], (0, 0, 800, 50))
    title = title_font.render("My Game UI", True, palette["text"])
    screen.blit(title, (20, 12))

    # 左侧面板
    pygame.draw.rect(screen, palette["bg_light"], (20, 70, 200, 400), border_radius=8)

    # 按钮
    mouse_pos = pygame.mouse.get_pos()
    btn_rect = pygame.Rect(40, 100, 160, 45)
    hover = btn_rect.collidepoint(mouse_pos)
    pygame.draw.rect(screen, palette["button_hover"] if hover else palette["button"],
                     btn_rect, border_radius=6)
    btn_text = font.render("开始游戏", True, (255, 255, 255))
    screen.blit(btn_text, (btn_rect.x + 45, btn_rect.y + 12))

    # 第二个按钮
    btn2_rect = pygame.Rect(40, 160, 160, 45)
    hover2 = btn2_rect.collidepoint(mouse_pos)
    pygame.draw.rect(screen, palette["secondary"], btn2_rect, border_radius=6)
    btn2_text = font.render("设置", True, (255, 255, 255))
    screen.blit(btn2_text, (btn2_rect.x + 60, btn2_rect.y + 12))

    # 主内容区
    pygame.draw.rect(screen, palette["bg_light"], (240, 70, 540, 400), border_radius=8)

    # 模拟卡片
    pygame.draw.rect(screen, palette["primary"], (260, 90, 150, 100), border_radius=6)
    card_text = font.render("关卡 1", True, (255, 255, 255))
    screen.blit(card_text, (300, 130))

    pygame.draw.rect(screen, palette["accent"], (430, 90, 150, 100), border_radius=6)
    card2_text = font.render("关卡 2", True, (255, 255, 255))
    screen.blit(card2_text, (470, 130))

    # 配色信息面板
    y = 500
    info = [
        f"Primary:   {palette['primary']}",
        f"Secondary: {palette['secondary']}",
        f"Accent:    {palette['accent']}",
        f"BG Dark:   {palette['bg_dark']}",
        f"BG Light:  {palette['bg_light']}",
        f"Text:      {palette['text']}",
    ]
    for i, line in enumerate(info):
        t = font.render(line, True, palette["text"])
        screen.blit(t, (20 + i * 130, y))

    # 提示
    hint = font.render("按 ←→ 切换色相 | 按空格随机 | 按 S 保存方案", True, palette["text"])
    screen.blit(hint, (20, 570))

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                base_hue = (base_hue - 15) % 360
                palette = generate_ui_palette(base_hue)
            if event.key == pygame.K_RIGHT:
                base_hue = (base_hue + 15) % 360
                palette = generate_ui_palette(base_hue)
            if event.key == pygame.K_SPACE:
                base_hue = random.randint(0, 360)
                palette = generate_ui_palette(base_hue)
            if event.key == pygame.K_s:
                print("当前配色方案：")
                for k, v in palette.items():
                    print(f"  {k}: {v}")

    draw_ui_demo(palette)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()