# GESP等级：四级 | GESP Python 四级考点
"""
main.py — 弹球大作战入口
完整弹球游戏项目，三层功能选择

功能层级:
  ⭐   — 基础打砖块（完整可玩）
  ⭐⭐ — 自定义颜色/速度/挡板
  ⭐⭐⭐ — 道具/特效/最高分/连击
"""

import sys
import os

# 确保能找到模块
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

import pygame
from game import Game


# ============================================================
# 主菜单
# ============================================================
class MainMenu:
    """
    主菜单界面
    提供层级选择、难度选择、操作说明
    """

    SCREEN_WIDTH = 800
    SCREEN_HEIGHT = 620

    # 颜色方案
    BG_COLOR = (8, 8, 25)
    TITLE_COLOR = (255, 215, 50)
    SUBTITLE_COLOR = (150, 150, 200)
    MENU_COLOR = (200, 200, 200)
    MENU_HOVER = (255, 255, 100)
    DESC_COLOR = (180, 180, 180)

    def __init__(self):
        """初始化菜单"""
        pygame.init()
        self.screen = pygame.display.set_mode(
            (self.SCREEN_WIDTH, self.SCREEN_HEIGHT)
        )
        pygame.display.set_caption("弹球大作战 - 主菜单")
        self.clock = pygame.time.Clock()
        self.font_title = pygame.font.Font(None, 64)
        self.font_subtitle = pygame.font.Font(None, 28)
        self.font_menu = pygame.font.Font(None, 36)
        self.font_desc = pygame.font.Font(None, 22)
        self.font_small = pygame.font.Font(None, 18)
        self.running = True
        self.selected_tier = 1
        self.selected_difficulty = 1  # 0=easy, 1=normal, 2=hard
        self.hover_tier = 0
        self.hover_difficulty = 0
        self.hover_start = False
        self.anim_frame = 0

        # 菜单项
        self.tier_items = [
            {"label": "⭐ 基础模式", "desc": "完整打砖块游戏，物理碰撞、计分、生命值"},
            {"label": "⭐⭐ 自定义模式", "desc": "可调颜色/速度/挡板大小/背景色"},
            {"label": "⭐⭐⭐ 扩展模式", "desc": "道具系统 / 特殊砖块 / 粒子特效 / 连击"},
        ]
        self.diff_items = ["简单", "普通", "困难"]

    def run(self):
        """运行主菜单循环"""
        while self.running:
            self.anim_frame += 1
            self._handle_events()
            self._draw()
            self.clock.tick(60)
        pygame.quit()
        sys.exit()

    def _handle_events(self):
        """处理菜单事件"""
        mouse_x, mouse_y = pygame.mouse.get_pos()

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

            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    self.running = False
                elif event.key == pygame.K_UP:
                    self.selected_tier = max(1, self.selected_tier - 1)
                elif event.key == pygame.K_DOWN:
                    self.selected_tier = min(3, self.selected_tier + 1)
                elif event.key == pygame.K_LEFT:
                    self.selected_difficulty = max(0, self.selected_difficulty - 1)
                elif event.key == pygame.K_RIGHT:
                    self.selected_difficulty = min(2, self.selected_difficulty + 1)
                elif event.key == pygame.K_RETURN or event.key == pygame.K_SPACE:
                    self._start_game()

            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:  # 左键
                    # 检查层级点击
                    for i, item in enumerate(self.tier_items):
                        y = 220 + i * 70
                        rect = pygame.Rect(150, y, 500, 50)
                        if rect.collidepoint(mouse_x, mouse_y):
                            self.selected_tier = i + 1
                            self._start_game()
                            return

                    # 检查开始按钮点击
                    start_rect = pygame.Rect(
                        self.SCREEN_WIDTH // 2 - 100, 470, 200, 50
                    )
                    if start_rect.collidepoint(mouse_x, mouse_y):
                        self._start_game()

        # 悬停检测
        self.hover_tier = 0
        self.hover_difficulty = 0
        self.hover_start = False

        for i in range(3):
            y = 220 + i * 70
            if pygame.Rect(150, y, 500, 50).collidepoint(mouse_x, mouse_y):
                self.hover_tier = i + 1

        for i in range(3):
            x = 240 + i * 120
            if pygame.Rect(x, 415, 100, 35).collidepoint(mouse_x, mouse_y):
                self.hover_difficulty = i + 1

        start_rect = pygame.Rect(
            self.SCREEN_WIDTH // 2 - 100, 470, 200, 50
        )
        if start_rect.collidepoint(mouse_x, mouse_y):
            self.hover_start = True

    def _start_game(self):
        """启动游戏"""
        difficulty_map = ["easy", "normal", "hard"]
        diff = difficulty_map[self.selected_difficulty]
        game = Game(tier=self.selected_tier, difficulty=diff)
        game.run()

    def _draw(self):
        """绘制菜单界面"""
        self.screen.fill(self.BG_COLOR)

        # 装饰性背景粒子
        for _ in range(20):
            x = (self.anim_frame * 2 + _ * 37) % self.SCREEN_WIDTH
            y = (self.anim_frame + _ * 53) % self.SCREEN_HEIGHT
            alpha = 30 + (_ % 5) * 10
            pygame.draw.circle(
                self.screen, (50, 50, 100, alpha), (int(x), int(y)), 2
            )

        # === 标题 ===
        title = self.font_title.render("弹球大作战", True, self.TITLE_COLOR)
        title_rect = title.get_rect(center=(self.SCREEN_WIDTH // 2, 80))
        self.screen.blit(title, title_rect)

        subtitle = self.font_subtitle.render(
            "Python OOP 弹球游戏  |  选择难度开始游戏",
            True, self.SUBTITLE_COLOR,
        )
        sub_rect = subtitle.get_rect(center=(self.SCREEN_WIDTH // 2, 120))
        self.screen.blit(subtitle, sub_rect)

        # === 层级选择 ===
        for i, item in enumerate(self.tier_items):
            y = 220 + i * 70
            selected = self.selected_tier == i + 1
            hovered = self.hover_tier == i + 1

            # 背景
            if selected:
                bg_rect = pygame.Rect(145, y - 5, 510, 60)
                pygame.draw.rect(self.screen, (40, 40, 80), bg_rect, border_radius=8)
                pygame.draw.rect(self.screen, (255, 215, 50), bg_rect, 2, border_radius=8)
            elif hovered:
                bg_rect = pygame.Rect(145, y - 5, 510, 60)
                pygame.draw.rect(self.screen, (30, 30, 60), bg_rect, border_radius=8)

            # 标签
            color = self.MENU_HOVER if selected else self.MENU_COLOR
            label = self.font_menu.render(item["label"], True, color)
            self.screen.blit(label, (165, y))

            # 描述
            desc = self.font_desc.render(item["desc"], True, self.DESC_COLOR)
            self.screen.blit(desc, (165, y + 30))

        # === 难度选择 ===
        diff_label = self.font_menu.render("难度:", True, (200, 200, 200))
        self.screen.blit(diff_label, (150, 415))

        for i, d in enumerate(self.diff_items):
            x = 240 + i * 120
            selected = self.selected_difficulty == i
            hovered = self.hover_difficulty == i + 1

            color = (255, 215, 50) if selected else \
                    (255, 255, 255) if hovered else \
                    (150, 150, 150)

            if selected:
                pygame.draw.rect(
                    self.screen, (50, 50, 80),
                    (x - 5, 412, 100, 35), border_radius=5
                )

            label = self.font_menu.render(d, True, color)
            self.screen.blit(label, (x, 415))

        # === 开始按钮 ===
        btn_x = self.SCREEN_WIDTH // 2 - 100
        btn_y = 470
        btn_color = (60, 180, 60) if self.hover_start else (40, 130, 40)

        pygame.draw.rect(
            self.screen, btn_color,
            (btn_x, btn_y, 200, 50), border_radius=10
        )
        pygame.draw.rect(
            self.screen, (100, 255, 100),
            (btn_x, btn_y, 200, 50), 2, border_radius=10
        )

        if self.hover_start:
            self.anim_frame += 1
            glow = abs(int(30 * self.anim_frame % 60 - 30))
            pygame.draw.rect(
                self.screen, (100, 255, 100, glow),
                (btn_x - 2, btn_y - 2, 204, 54), 2, border_radius=12
            )

        start_text = self.font_menu.render("开始游戏", True, (255, 255, 255))
        start_rect = start_text.get_rect(center=(self.SCREEN_WIDTH // 2, btn_y + 25))
        self.screen.blit(start_text, start_rect)

        # === 操作说明 ===
        controls = [
            "操作说明: 鼠标/方向键控制挡板 | SPACE发射 | ESC退出",
            "游戏中按 F1 打开设置面板查看所有快捷键",
        ]
        for i, c in enumerate(controls):
            text = self.font_small.render(c, True, (100, 100, 120))
            self.screen.blit(text, (self.SCREEN_WIDTH // 2 - text.get_width() // 2, 545 + i * 22))

        # === 选中层级悬停信息 ===
        tier = self.selected_tier
        if tier == 1:
            features = ["物理碰撞引擎", "计分/生命/关卡", "键盘+鼠标控制"]
        elif tier == 2:
            features = ["⭐基础 +", "球颜色切换 [C]", "背景色切换 [V]", "速度调节 [+/-]", "挡板大小 [ [/] ]"]
        else:
            features = ["⭐⭐ +", "道具系统（宽板/分身/减速/加命）", "特殊砖块（坚硬/不可摧毁）", "粒子特效 + 连击系统", "最高分持久化存储 + 音效"]

        for i, f in enumerate(features):
            text = self.font_small.render(f"  {f}", True, (120, 120, 150))
            self.screen.blit(text, (610, 200 + i * 22))

        pygame.display.flip()


# ============================================================
# 直接运行
# ============================================================
if __name__ == "__main__":
    menu = MainMenu()
    menu.run()
