# 导入依赖库
import pygame
import math

# ===================== 初始化配置 =====================
pygame.init()
WIDTH, HEIGHT = 850, 680
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("学生雨衣收纳烘干控制系统")

# 中文字体 解决乱码+统一对齐
try:
    font_small = pygame.font.Font("simhei.ttf", 28)
    font_mid = pygame.font.Font("simhei.ttf", 32)
    font_large = pygame.font.Font("simhei.ttf", 42)
    font_screen = pygame.font.Font("simhei.ttf", 36)
except:
    font_small = pygame.font.SysFont("SimHei", 28)
    font_mid = pygame.font.SysFont("SimHei", 32)
    font_large = pygame.font.SysFont("SimHei", 42)
    font_screen = pygame.font.SysFont("SimHei", 36)

# 颜色定义
BG_COLOR = (25, 25, 45)
WHITE = (255, 255, 255)
GRAY = (90, 90, 110)
BLUE = (40, 140, 240)
RED = (255, 50, 50)
GREEN = (0, 200, 90)
ORANGE = (255, 150, 0)
BLACK = (0, 0, 0)
YELLOW = (230, 230, 0)
LIGHT_BLUE = (100, 180, 255)

# ===================== 系统状态变量 =====================
dry_start = False                 # 烘干是否启动
student_data = {}                 # 存放 {学号:雨衣数量}
temperature = 30                  # 烘干温度
disinfection = False              # 消毒状态
student_id = ""                   # 正在输入的学号
current_id = ""                   # 已确认当前学号
knob_dragging = False             # 温度旋钮拖动

# 雨衣转盘配置（顶部）
TURN_CENTER = (WIDTH // 2, 80)    # 转盘中心
TURN_RADIUS = 60                  # 转盘半径
TURN_SLOTS = 8                    # 8个存放位

# ===================== UI组件坐标 规整布局 =====================
# 顶部显示屏
SCREEN_RECT = pygame.Rect(40, 160, 770, 110)

# 数字键盘 3行4列
KEY_POS = []
key_x, key_y = 60, 300
key_w, key_h = 65, 55
for i in range(3):
    for j in range(4):
        KEY_POS.append(pygame.Rect(key_x + j*75, key_y + i*65, key_w, key_h))
KEY_TEXT = ["1","2","3","4","5","6","7","8","9","","0",""]

# 功能按钮：开始烘干、存、取、确认
BTN_DRY = pygame.Rect(520, 300, 130, 55)
BTN_SAVE  = pygame.Rect(520, 370, 130, 55)
BTN_TAKE  = pygame.Rect(520, 440, 130, 55)
BTN_OK    = pygame.Rect(520, 510, 130, 55)

# 温度旋钮
KNOB_CENTER = (680, 550)
KNOB_RADIUS = 48

# 消毒开关
SWITCH_RECT = pygame.Rect(80, 500, 100, 48)

# ===================== 新增：绘制雨衣存放转盘 =====================
def draw_raincoat_turnplate():
    """绘制顶部雨衣存放转盘，显示占用数量"""
    # 总雨衣数量
    total_raincoats = sum(student_data.values())
    
    # 转盘底盘
    pygame.draw.circle(screen, GRAY, TURN_CENTER, TURN_RADIUS + 5)
    pygame.draw.circle(screen, WHITE, TURN_CENTER, TURN_RADIUS + 5, 3)
    
    # 绘制8个存放扇区
    for i in range(TURN_SLOTS):
        start_angle = math.radians(i * (360 / TURN_SLOTS))
        end_angle = math.radians((i + 1) * (360 / TURN_SLOTS))
        
        # 有雨衣的位置亮蓝色，空的灰色
        color = LIGHT_BLUE if i < total_raincoats else (70,70,90)
        points = [TURN_CENTER]
        for a in [start_angle, end_angle]:
            x = TURN_CENTER[0] + math.cos(a) * TURN_RADIUS
            y = TURN_CENTER[1] + math.sin(a) * TURN_RADIUS
            points.append((x, y))
        pygame.draw.polygon(screen, color, points)
        pygame.draw.arc(screen, WHITE, 
                       (TURN_CENTER[0]-TURN_RADIUS, TURN_CENTER[1]-TURN_RADIUS, 
                        TURN_RADIUS*2, TURN_RADIUS*2), 
                       start_angle, end_angle, 2)
    
    # 转盘中心
    pygame.draw.circle(screen, WHITE, TURN_CENTER, 8)
    # 标题
    title = font_small.render("雨衣存放转盘", True, WHITE)
    screen.blit(title, title.get_rect(center=(TURN_CENTER[0], TURN_CENTER[1] + 90)))

# ===================== 原有绘制函数 =====================
def draw_display():
    """状态显示屏：只显示当前学号自己的雨衣数量"""
    pygame.draw.rect(screen, GRAY, SCREEN_RECT, border_radius=12)
    pygame.draw.rect(screen, BLACK, SCREEN_RECT, 3, border_radius=12)

    # 获取当前学号自己的雨衣数量
    own_num = student_data.get(current_id, 0)
    dry_state = "烘干中" if dry_start else "未启动烘干"
    total_num = sum(student_data.values())
    
    line1 = f"当前学号：{current_id if current_id else '未输入'}    烘干状态：{dry_state}"
    line2 = f"个人雨衣：{own_num} 件  总库存：{total_num} 件  温度：{temperature}℃  消毒：{'开启' if disinfection else '关闭'}"
    
    text1 = font_screen.render(line1, True, GREEN if dry_start else WHITE)
    text2 = font_screen.render(line2, True, RED if disinfection else WHITE)
    
    # 居中绘制
    screen.blit(text1, text1.get_rect(center=(SCREEN_RECT.centerx, SCREEN_RECT.y + 35)))
    screen.blit(text2, text2.get_rect(center=(SCREEN_RECT.centerx, SCREEN_RECT.y + 75)))

def draw_num_keyboard():
    """数字键盘 数字居中"""
    for i, rect in enumerate(KEY_POS):
        col = BLUE if dry_start else (60,60,80)
        pygame.draw.rect(screen, col, rect, border_radius=8)
        pygame.draw.rect(screen, WHITE, rect, 2, border_radius=8)
        if KEY_TEXT[i]:
            text = font_large.render(KEY_TEXT[i], True, WHITE)
            screen.blit(text, text.get_rect(center=rect.center))

def draw_buttons():
    """所有功能按钮 文字全部居中对齐"""
    # 开始烘干按钮
    s_col = YELLOW if not dry_start else GREEN
    pygame.draw.rect(screen, s_col, BTN_DRY, border_radius=8)
    pygame.draw.rect(screen, WHITE, BTN_DRY, 2, border_radius=8)
    t_dry = font_mid.render("开始烘干", True, BLACK)
    screen.blit(t_dry, t_dry.get_rect(center=BTN_DRY.center))

    # 存雨衣
    col_save = GREEN if dry_start else (60,60,80)
    pygame.draw.rect(screen, col_save, BTN_SAVE, border_radius=8)
    pygame.draw.rect(screen, WHITE, BTN_SAVE, 2, border_radius=8)
    t_save = font_mid.render("存雨衣", True, WHITE)
    screen.blit(t_save, t_save.get_rect(center=BTN_SAVE.center))

    # 取雨衣
    col_take = ORANGE if dry_start else (60,60,80)
    pygame.draw.rect(screen, col_take, BTN_TAKE, border_radius=8)
    pygame.draw.rect(screen, WHITE, BTN_TAKE, 2, border_radius=8)
    t_take = font_mid.render("取雨衣", True, WHITE)
    screen.blit(t_take, t_take.get_rect(center=BTN_TAKE.center))

    # 确认学号
    col_ok = BLUE if dry_start else (60,60,80)
    pygame.draw.rect(screen, col_ok, BTN_OK, border_radius=8)
    pygame.draw.rect(screen, WHITE, BTN_OK, 2, border_radius=8)
    t_ok = font_mid.render("确认学号", True, WHITE)
    screen.blit(t_ok, t_ok.get_rect(center=BTN_OK.center))

def draw_temp_knob():
    """温度旋钮 文字居中"""
    pygame.draw.circle(screen, GRAY, KNOB_CENTER, KNOB_RADIUS+10)
    pygame.draw.circle(screen, WHITE, KNOB_CENTER, KNOB_RADIUS+10, 3)
    k_col = BLUE if dry_start else (60,60,80)
    pygame.draw.circle(screen, k_col, KNOB_CENTER, KNOB_RADIUS)
    
    angle = math.radians((temperature - 20) * 9)
    px = KNOB_CENTER[0] + math.cos(angle) * (KNOB_RADIUS - 10)
    py = KNOB_CENTER[1] + math.sin(angle) * (KNOB_RADIUS - 10)
    pygame.draw.line(screen, WHITE, KNOB_CENTER, (px, py), 5)
    
    temp_text = font_small.render(f"{temperature}℃", True, WHITE)
    screen.blit(temp_text, temp_text.get_rect(center=(KNOB_CENTER[0], KNOB_CENTER[1]+70)))

def draw_disinfection_switch():
    """消毒开关 文字对齐"""
    color = RED if (disinfection and dry_start) else GRAY
    pygame.draw.rect(screen, color, SWITCH_RECT, border_radius=25)
    pygame.draw.rect(screen, WHITE, SWITCH_RECT, 3, border_radius=25)
    slider_x = SWITCH_RECT.x + 60 if disinfection else SWITCH_RECT.x + 10
    pygame.draw.circle(screen, WHITE, (slider_x, SWITCH_RECT.y+24), 18)
    
    text = font_small.render("消毒杀菌", True, WHITE)
    screen.blit(text, text.get_rect(right=SWITCH_RECT.x-10, centery=SWITCH_RECT.centery))

# ===================== 交互逻辑 =====================
def handle_mouse_click(pos):
    global student_id, current_id, disinfection, dry_start
    # 开始烘干按钮
    if BTN_DRY.collidepoint(pos):
        dry_start = True
        return
    
    # 未启动烘干 禁止所有其他操作
    if not dry_start:
        return

    # 数字键盘输入学号
    for i, rect in enumerate(KEY_POS):
        if rect.collidepoint(pos) and KEY_TEXT[i]:
            student_id += KEY_TEXT[i]

    # 确认学号
    if BTN_OK.collidepoint(pos):
        if student_id:
            current_id = student_id
        student_id = ""

    # 存雨衣：存入当前学号名下
    if BTN_SAVE.collidepoint(pos):
        if current_id:
            student_data[current_id] = student_data.get(current_id, 0) + 1

    # 取雨衣：只能取自己学号的，自己没有不能取
    if BTN_TAKE.collidepoint(pos):
        if current_id and student_data.get(current_id, 0) > 0:
            student_data[current_id] -= 1

    # 消毒开关
    if SWITCH_RECT.collidepoint(pos):
        disinfection = not disinfection

def handle_knob_drag(pos):
    global temperature
    if not dry_start:
        return
    dx = pos[0] - KNOB_CENTER[0]
    dy = pos[1] - KNOB_CENTER[1]
    angle = math.degrees(math.atan2(dy, dx))
    angle = angle + 360 if angle < 0 else angle
    temperature = 20 + int(angle / 9)
    temperature = max(20, min(60, temperature))

# ===================== 主循环 =====================
running = True
clock = pygame.time.Clock()

while running:
    clock.tick(60)
    screen.fill(BG_COLOR)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
            handle_mouse_click(event.pos)
            dist = math.hypot(event.pos[0]-KNOB_CENTER[0], event.pos[1]-KNOB_CENTER[1])
            if dist <= KNOB_RADIUS and dry_start:
                knob_dragging = True

        if event.type == pygame.MOUSEBUTTONUP:
            knob_dragging = False

        if event.type == pygame.MOUSEMOTION and knob_dragging:
            handle_knob_drag(event.pos)

    # 绘制所有界面（新增转盘）
    draw_raincoat_turnplate()
    draw_display()
    draw_num_keyboard()
    draw_buttons()
    draw_temp_knob()
    draw_disinfection_switch()

    # 输入学号提示 居中
    input_text = font_large.render(f"输入学号：{student_id}", True, WHITE)
    screen.blit(input_text, input_text.get_rect(center=(280, 560)))

    pygame.display.flip()

pygame.quit()