/**
 * 泡泡网格渲染（移植自 minigame-1）
 * 根据 state 中的 grid 二维数组和 pushAnimOffsetY 绘制网格泡泡
 */
import { getBubbleRadius, gridToScreen, drawBubble3D } from './bubble.js'
import { SCREEN_WIDTH, SCREEN_HEIGHT, SAFE_AREA_TOP, SAFE_AREA_BOTTOM } from '../constants.js'

/**
 * 绘制泡泡网格
 * @param {CanvasRenderingContext2D} ctx
 * @param {number[][]} grid 二维数组，grid[row][col] = 颜色索引 0-9，0 表示空
 * @param {number} [pushAnimOffsetY=0] 下推动画 Y 偏移（负值表示整体上移）
 */
export function drawBubbleGrid(ctx, grid, pushAnimOffsetY = 0) {
  if (!grid || !Array.isArray(grid)) return
  const offsetY = pushAnimOffsetY || 0
  for (let row = 0; row < grid.length; row++) {
    const rowArr = grid[row]
    if (!rowArr || !Array.isArray(rowArr)) continue
    for (let col = 0; col < rowArr.length; col++) {
      const color = rowArr[col]
      if (!color) continue
      const { x, y } = gridToScreen(row, col)
      drawBubble3D(ctx, x, y + offsetY, getBubbleRadius(), color)
    }
  }

  // 绘制危险线（与小游戏端判定逻辑完全一致）
  // 公式: shooterHeight=R*8.2, gameArea=SH-SAT-SAB-shooterHeight, maxRows=floor(gameArea/RH), dangerY=maxRows*RH+SAT
  const R = getBubbleRadius()
  const ROW_HEIGHT = R * Math.sqrt(3)
  const shooterHeight = R * 8.2
  const gameAreaHeight = SCREEN_HEIGHT - SAFE_AREA_TOP - SAFE_AREA_BOTTOM - shooterHeight
  const maxRows = Math.floor(gameAreaHeight / ROW_HEIGHT)
  const dangerY = maxRows * ROW_HEIGHT + SAFE_AREA_TOP
  ctx.save()
  ctx.strokeStyle = 'rgba(255, 0, 0, 0.7)'
  ctx.lineWidth = 2
  ctx.setLineDash([8, 4])
  ctx.beginPath()
  ctx.moveTo(0, dangerY)
  ctx.lineTo(SCREEN_WIDTH, dangerY)
  ctx.stroke()
  ctx.setLineDash([])
  ctx.restore()
}
