import pygame
import sys
import random

# 初始化
pygame.init()

# 窗口设置
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600

# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (100, 150, 255)
DARK_BLUE = (50, 80, 150)
YELLOW = (255, 255, 100)

# 星座数据
ZODIAC = [
    {"name": "白羊座", "date": "3.21-4.19", "symbol": "♈"},
    {"name": "金牛座", "date": "4.20-5.20", "symbol": "♉"},
    {"name": "双子座", "date": "5.21-6.21", "symbol": "♊"},
    {"name": "巨蟹座", "date": "6.22-7.22", "symbol": "♋"},
    {"name": "狮子座", "date": "7.23-8.22", "symbol": "♌"},
    {"name": "处女座", "date": "8.23-9.22", "symbol": "♍"},
    {"name": "天秤座", "date": "9.23-10.23", "symbol": "♎"},
    {"name": "天蝎座", "date": "10.24-11.22", "symbol": "♏"},
    {"name": "射手座", "date": "11.23-12.21", "symbol": "♐"},
    {"name": "摩羯座", "date": "12.22-1.19", "symbol": "♑"},
    {"name": "水瓶座", "date": "1.20-2.18", "symbol": "♒"},
    {"name": "双鱼座", "date": "2.19-3.20", "symbol": "♓"}
]


def get_zodiac(month, day):
    """根据生日获取星座"""
    date = month * 100 + day
    if (321 <= date <= 419):
        return ZODIAC[0]
    if (420 <= date <= 520):
        return ZODIAC[1]
    if (521 <= date <= 621):
        return ZODIAC[2]
    if (622 <= date <= 722):
        return ZODIAC[3]
    if (723 <= date <= 822):
        return ZODIAC[4]
    if (823 <= date <= 922):
        return ZODIAC[5]
    if (923 <= date <= 1023):
        return ZODIAC[6]
    if (1024 <= date <= 1122):
        return ZODIAC[7]
    if (1123 <= date <= 1221):
        return ZODIAC[8]
    if (1222 <= date <= 1231):
        return ZODIAC[9]
    if (101 <= date <= 119):
        return ZODIAC[9]
    if (120 <= date <= 218):
        return ZODIAC[10]
    return ZODIAC[11]


def main():
    screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption("星座查询")
    clock = pygame.time.Clock()

    # 字体
    font_title = pygame.font.Font(None, 48)
    font_normal = pygame.font.Font(None, 32)
    font_small = pygame.font.Font(None, 24)

    # 输入框
    month_text = ""
    day_text = ""
    month_active = False
    day_active = False
    result = None
    message = ""
    message_time = 0

    # 输入框位置
    month_rect = pygame.Rect(300, 250, 80, 40)
    day_rect = pygame.Rect(420, 250, 80, 40)
    query_rect = pygame.Rect(530, 250, 100, 40)

    running = True
    while running:
        current_time = pygame.time.get_ticks()
        mouse_pos = pygame.mouse.get_pos()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

            # 鼠标点击
            if event.type == pygame.MOUSEBUTTONDOWN:
                month_active = month_rect.collidepoint(event.pos)
                day_active = day_rect.collidepoint(event.pos)

                if query_rect.collidepoint(event.pos):
                    try:
                        month = int(month_text) if month_text else 0
                        day = int(day_text) if day_text else 0
                        if 1 <= month <= 12 and 1 <= day <= 31:
                            result = get_zodiac(month, day)
                            message = f"您的星座是：{result['name']} {result['symbol']}"
                        else:
                            message = "请输入有效日期！"
                        message_time = current_time
                    except:
                        message = "请输入数字！"
                        message_time = current_time

            # 键盘输入
            if event.type == pygame.KEYDOWN:
                if month_active:
                    if event.key == pygame.K_BACKSPACE:
                        month_text = month_text[:-1]
                    elif event.unicode.isdigit() and len(month_text) < 2:
                        month_text += event.unicode
                elif day_active:
                    if event.key == pygame.K_BACKSPACE:
                        day_text = day_text[:-1]
                    elif event.unicode.isdigit() and len(day_text) < 2:
                        day_text += event.unicode

        # 绘制
        screen.fill(DARK_BLUE)

        # 标题
        title = font_title.render("星座查询小助手", True, YELLOW)
        title_rect = title.get_rect(center=(WINDOW_WIDTH//2, 80))
        screen.blit(title, title_rect)

        # 星座列表
        y = 150
        for i, sign in enumerate(ZODIAC):
            color = (100 + i * 10, 100, 200 - i * 10)
            text = font_small.render(
                f"{sign['symbol']} {sign['name']} ({sign['date']})", True, WHITE)
            screen.blit(text, (50, y + i * 25))

        # 输入区域
        label = font_normal.render("请输入您的生日：", True, WHITE)
        screen.blit(label, (300, 200))

        # 月输入框
        pygame.draw.rect(screen, WHITE, month_rect)
        pygame.draw.rect(screen, BLUE if month_active else (
            100, 100, 100), month_rect, 3)
        month_surface = font_normal.render(
            month_text or "月", True, BLACK if month_text else (150, 150, 150))
        screen.blit(month_surface, (month_rect.x + 10, month_rect.y + 8))

        # 日输入框
        pygame.draw.rect(screen, WHITE, day_rect)
        pygame.draw.rect(screen, BLUE if day_active else (
            100, 100, 100), day_rect, 3)
        day_surface = font_normal.render(
            day_text or "日", True, BLACK if day_text else (150, 150, 150))
        screen.blit(day_surface, (day_rect.x + 10, day_rect.y + 8))

        # 查询按钮
        pygame.draw.rect(screen, (100, 200, 100), query_rect)
        pygame.draw.rect(screen, WHITE, query_rect, 2)
        query_text = font_normal.render("查询", True, WHITE)
        query_rect_text = query_text.get_rect(center=query_rect.center)
        screen.blit(query_text, query_rect_text)

        # 显示结果
        if message and current_time - message_time < 3000:
            msg_surface = font_normal.render(message, True, YELLOW)
            msg_rect = msg_surface.get_rect(center=(WINDOW_WIDTH//2, 350))
            screen.blit(msg_surface, msg_rect)

        # 显示详细结果
        if result and current_time - message_time < 3000:
            detail_y = 400
            traits = ["热情", "勇敢", "乐观"] if "羊" in result['name'] else [
                "稳重", "务实"] if "牛" in result['name'] else ["聪明", "善变"]
            detail_text = font_small.render(
                f"性格特点：{', '.join(traits)}", True, WHITE)
            screen.blit(detail_text, (WINDOW_WIDTH//2 - 150, detail_y))

        # 提示
        tip = font_small.render(
            "提示：输入月份和日期，点击查询即可知道您的星座", True, (150, 150, 200))
        tip_rect = tip.get_rect(center=(WINDOW_WIDTH//2, 550))
        screen.blit(tip, tip_rect)

        pygame.display.flip()
        clock.tick(60)

    pygame.quit()
    sys.exit()


if __name__ == "__main__":
    main()
