import pygame
import sys

# --- 初始化 ---
pygame.init()
WIDTH, HEIGHT = 800, 500
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("2D 证件生成器 (拖拽图片更换头像, Ctrl+S保存)")

# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (200, 200, 200)
BLUE = (0, 102, 204)
BG_COLOR = (240, 240, 240)
RED = (255, 0, 0)

# 字体设置 (尝试加载中文字体，如果系统没有则回退)
def get_font(size):
    try:
        return pygame.font.SysFont("SimHei", size) # Windows 常用黑体
    except:
        return pygame.font.SysFont("arial", size)

# 初始数据
data = {
    "姓名": "张三",
    "职位": "高级开发工程师",
    "编号": "ID-9527"
}
active_field = "姓名"
avatar = pygame.Surface((120, 150))
avatar.fill((150, 150, 150)) # 默认灰色头像

def draw_id_card(x, y):
    """绘制证件预览图"""
    card_w, card_h = 400, 250
    # 证件背景
    card_rect = pygame.Rect(x, y, card_w, card_h)
    pygame.draw.rect(screen, WHITE, card_rect, border_radius=10)
    pygame.draw.rect(screen, BLUE, card_rect, 2, border_radius=10)
    
    # 顶部条
    pygame.draw.rect(screen, BLUE, (x, y, card_w, 40), border_top_left_radius=10, border_top_right_radius=10)
    title_font = get_font(24)
    title_text = title_font.render("工作证 / ID CARD", True, WHITE)
    screen.blit(title_text, (x + 20, y + 8))

    # 绘制头像
    avatar_rect = pygame.Rect(x + 20, y + 60, 120, 150)
    screen.blit(pygame.transform.scale(avatar, (120, 150)), avatar_rect)
    pygame.draw.rect(screen, GRAY, avatar_rect, 1)

    # 绘制文字信息
    info_font = get_font(20)
    label_font = get_font(16)
    
    labels = ["姓名:", "职位:", "编号:"]
    values = [data["姓名"], data["职位"], data["编号"]]
    
    for i in range(3):
        # 标签
        lbl = label_font.render(labels[i], True, (100, 100, 100))
        screen.blit(lbl, (x + 160, y + 70 + i * 50))
        # 内容
        val = info_font.render(values[i], True, BLACK)
        screen.blit(val, (x + 160, y + 90 + i * 50))

def main():
    global active_field, avatar
    clock = pygame.time.Clock()
    input_active = True

    while True:
        screen.fill(BG_COLOR)
        
        # 1. 绘制左侧操作说明
        instr_font = get_font(18)
        instructions = [
            f"当前编辑: {active_field}",
            "1. 点击键盘 1: 姓名, 2: 职位, 3: 编号",
            "2. 直接输入文字 (仅限英文/数字/退格)",
            "3. 拖拽图片文件到窗口更换头像",
            "4. 按 Ctrl + S 保存证件图片"
        ]
        for i, text in enumerate(instructions):
            color = RED if "当前编辑" in text else BLACK
            color = (200, 0, 0) if i == 0 else BLACK
            msg = instr_font.render(text, True, color)
            screen.blit(msg, (20, 50 + i * 30))

        # 2. 绘制右侧证件预览
        draw_id_card(350, 100)

        # 3. 事件处理
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            
            # 拖拽文件处理
            if event.type == pygame.DROPFILE:
                try:
                    new_img = pygame.image.load(event.file)
                    avatar = new_img
                except:
                    print("无法加载图片")

            if event.type == pygame.KEYDOWN:
                # 切换编辑项
                if event.key == pygame.K_1: active_field = "姓名"
                elif event.key == pygame.K_2: active_field = "职位"
                elif event.key == pygame.K_3: active_field = "编号"
                
                # 保存功能
                elif event.key == pygame.K_s and (pygame.key.get_mods() & pygame.KMOD_CTRL):
                    # 截取证件区域并保存
                    sub = screen.subsurface((350, 100, 400, 250))
                    pygame.image.save(sub, "ID_Card.png")
                    print("证件已保存为 ID_Card.png")

                # 文字输入逻辑
                elif event.key == pygame.K_BACKSPACE:
                    data[active_field] = data[active_field][:-1]
                else:
                    if event.unicode.isprintable():
                        data[active_field] += event.unicode

        pygame.display.flip()
        clock.tick(30)

if __name__ == "__main__":
    main()