import pygame
import sys
from datetime import date
import random

# 初始化Pygame
pygame.init()

# 窗口设置
WINDOW_WIDTH = 900
WINDOW_HEIGHT = 600
BACKGROUND_COLOR = (255, 240, 245)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 80, 80)
GREEN = (80, 200, 80)
BLUE = (80, 150, 255)
YELLOW = (255, 255, 100)
PINK = (255, 105, 180)
GRAY = (128, 128, 128)
LIGHT_GREEN = (144, 238, 144)

# 祝福语
BLESSINGS = [
    "生日快乐！愿你永远开心！",
    "祝你生日快乐，万事如意！",
    "愿你的每一天都充满阳光！",
    "生日快乐，梦想成真！"
]


class Person:
    def __init__(self, name, birth_date):
        self.name = name
        self.birth_date = birth_date  # "MM-DD"

    def days_until_birthday(self):
        today = date.today()
        month, day = map(int, self.birth_date.split('-'))
        birthday_this_year = date(today.year, month, day)
        if birthday_this_year < today:
            birthday_this_year = date(today.year + 1, month, day)
        return (birthday_this_year - today).days


def main():
    screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption("生日提醒器")
    clock = pygame.time.Clock()

    # 字体
    try:
        font_big = pygame.font.Font(None, 48)
        font_normal = pygame.font.Font(None, 32)
        font_small = pygame.font.Font(None, 24)
    except:
        font_big = pygame.font.Font(None, 48)
        font_normal = pygame.font.Font(None, 32)
        font_small = pygame.font.Font(None, 24)

    # 示例数据
    people = [
        Person("张三", "12-25"),
        Person("李四", "01-01"),
        Person("王五", "03-15"),
    ]

    # 输入框
    name_text = ""
    date_text = ""
    name_active = False
    date_active = False
    message = ""
    message_timer = 0

    # 输入框矩形
    name_rect = pygame.Rect(200, 500, 200, 40)
    date_rect = pygame.Rect(420, 500, 150, 40)
    add_rect = pygame.Rect(600, 500, 100, 40)

    # 滚动
    scroll_y = 0
    item_height = 80

    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:
                name_active = name_rect.collidepoint(event.pos)
                date_active = date_rect.collidepoint(event.pos)

                # 添加按钮
                if add_rect.collidepoint(event.pos):
                    if name_text and date_text:
                        try:
                            # 验证日期格式
                            month, day = map(int, date_text.split('-'))
                            if 1 <= month <= 12 and 1 <= day <= 31:
                                people.append(Person(name_text, date_text))
                                name_text = ""
                                date_text = ""
                                message = f"已添加：{name_text}"
                                message_timer = current_time
                            else:
                                message = "日期无效！"
                                message_timer = current_time
                        except:
                            message = "格式错误！用 MM-DD"
                            message_timer = current_time

                # 删除按钮
                for i, person in enumerate(people):
                    del_rect = pygame.Rect(
                        WINDOW_WIDTH - 100, 120 + i * item_height - scroll_y, 60, 30)
                    if del_rect.collidepoint(event.pos):
                        del people[i]
                        message = f"已删除：{person.name}"
                        message_timer = current_time
                        break

            # 键盘输入
            if event.type == pygame.KEYDOWN:
                if name_active:
                    if event.key == pygame.K_BACKSPACE:
                        name_text = name_text[:-1]
                    elif event.key == pygame.K_RETURN:
                        name_active = False
                    else:
                        if len(name_text) < 15:
                            name_text += event.unicode
                elif date_active:
                    if event.key == pygame.K_BACKSPACE:
                        date_text = date_text[:-1]
                    elif event.key == pygame.K_RETURN:
                        date_active = False
                    else:
                        if len(date_text) < 5:
                            date_text += event.unicode

        # 绘制
        screen.fill(BACKGROUND_COLOR)

        # 标题
        title = font_big.render("🎂 生日提醒器 🎂", True, (255, 80, 120))
        title_rect = title.get_rect(center=(WINDOW_WIDTH//2, 40))
        screen.blit(title, title_rect)

        # 今天生日提醒
        today = date.today().strftime("%m-%d")
        for person in people:
            if person.birth_date == today:
                warning = font_normal.render(
                    f"🎉 今天{person.name}生日！ 🎉", True, RED)
                warning_rect = warning.get_rect(center=(WINDOW_WIDTH//2, 100))
                screen.blit(warning, warning_rect)

        # 生日列表
        list_title = font_normal.render("生日列表", True, (100, 100, 100))
        screen.blit(list_title, (50, 120))

        for i, person in enumerate(people):
            y = 150 + i * item_height - scroll_y
            if 150 <= y <= 600:
                # 背景
                pygame.draw.rect(
                    screen, WHITE, (50, y, WINDOW_WIDTH-100, item_height-5))
                pygame.draw.rect(
                    screen, GRAY, (50, y, WINDOW_WIDTH-100, item_height-5), 2)

                # 姓名
                name_surface = font_normal.render(person.name, True, BLACK)
                screen.blit(name_surface, (70, y + 10))

                # 倒计时
                days = person.days_until_birthday()
                if days == 0:
                    days_text = "🎉 今天生日！"
                    color = RED
                elif days <= 7:
                    days_text = f"⚠️ 还有{days}天"
                    color = (255, 165, 0)
                else:
                    days_text = f"还有{days}天"
                    color = GREEN

                days_surface = font_small.render(days_text, True, color)
                screen.blit(days_surface, (70, y + 40))

                # 生日日期
                date_surface = font_small.render(
                    f"生日：{person.birth_date}", True, GRAY)
                screen.blit(date_surface, (200, y + 40))

                # 删除按钮
                del_rect = pygame.Rect(WINDOW_WIDTH - 100, y + 25, 60, 30)
                pygame.draw.rect(screen, RED, del_rect)
                pygame.draw.rect(screen, WHITE, del_rect, 2)
                del_text = font_small.render("删除", True, WHITE)
                del_text_rect = del_text.get_rect(center=del_rect.center)
                screen.blit(del_text, del_text_rect)

        # 添加区域
        add_label = font_normal.render("添加生日提醒", True, (100, 100, 100))
        screen.blit(add_label, (200, 470))

        # 姓名输入框
        pygame.draw.rect(screen, WHITE, name_rect)
        pygame.draw.rect(screen, BLUE if name_active else GRAY, name_rect, 2)
        name_surface = font_normal.render(
            name_text or "姓名", True, BLACK if name_text else GRAY)
        screen.blit(name_surface, (name_rect.x + 5, name_rect.y + 8))

        # 日期输入框
        pygame.draw.rect(screen, WHITE, date_rect)
        pygame.draw.rect(screen, BLUE if date_active else GRAY, date_rect, 2)
        date_surface = font_normal.render(
            date_text or "MM-DD", True, BLACK if date_text else GRAY)
        screen.blit(date_surface, (date_rect.x + 5, date_rect.y + 8))

        # 添加按钮
        pygame.draw.rect(screen, LIGHT_GREEN, add_rect)
        pygame.draw.rect(screen, BLACK, add_rect, 2)
        add_text = font_normal.render("添加", True, BLACK)
        add_text_rect = add_text.get_rect(center=add_rect.center)
        screen.blit(add_text, add_text_rect)

        # 显示消息
        if message and current_time - message_timer < 2000:
            msg_surface = font_normal.render(message, True, RED)
            msg_rect = msg_surface.get_rect(center=(WINDOW_WIDTH//2, 580))
            screen.blit(msg_surface, msg_rect)

        # 提示
        tip = font_small.render("提示：输入格式 月-日 (如 12-25)，点击删除可移除", True, GRAY)
        screen.blit(tip, (WINDOW_WIDTH//2 - tip.get_width()//2, 560))

        pygame.display.flip()
        clock.tick(60)

    pygame.quit()
    sys.exit()


if __name__ == "__main__":
    main()
