package com.pixelmintdrop.game

import android.content.Context
import android.graphics.BlurMaskFilter
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.View
import com.pixelmintdrop.model.GameBoard
import kotlin.math.min

/**
 * View that displays the currently held piece
 */
class HoldPieceView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {

    private var gameView: GameView? = null
    private var gameBoard: GameBoard? = null

    // Rendering
    private val blockPaint = Paint().apply {
        color = Color.WHITE
        isAntiAlias = true
        style = Paint.Style.FILL
    }

    private val glowPaint = Paint().apply {
        color = Color.WHITE
        alpha = 40
        isAntiAlias = true
        style = Paint.Style.STROKE
        strokeWidth = 1.5f
        maskFilter = BlurMaskFilter(8f, BlurMaskFilter.Blur.OUTER)
    }

    private val blockGlowPaint = Paint().apply {
        color = Color.WHITE
        alpha = 60
        isAntiAlias = true
        style = Paint.Style.FILL
        maskFilter = BlurMaskFilter(12f, BlurMaskFilter.Blur.OUTER)
    }

    /**
     * Set the game view reference
     */
    fun setGameView(view: GameView) {
        gameView = view
        gameBoard = view.getGameBoard()
    }

    /**
     * Get the game board reference
     */
    private fun getGameBoard(): GameBoard? = gameBoard

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        
        // Get the held piece from game board
        gameBoard?.let {
            it.getHoldPiece()?.let { piece ->
                val width = piece.getWidth()
                val height = piece.getHeight()
                
                // Calculate block size for the preview (smaller than main board)
                val previewBlockSize = min(
                    canvas.width.toFloat() / (width + 2),
                    canvas.height.toFloat() / (height + 2)
                )
                
                // Center the piece in the preview area
                val previewLeft = (canvas.width - width * previewBlockSize) / 2
                val previewTop = (canvas.height - height * previewBlockSize) / 2
                
                // Draw subtle background glow
                val glowPaint = Paint().apply {
                    color = Color.WHITE
                    alpha = 10
                    maskFilter = BlurMaskFilter(previewBlockSize * 0.5f, BlurMaskFilter.Blur.OUTER)
                }
                canvas.drawRect(
                    previewLeft - previewBlockSize,
                    previewTop - previewBlockSize,
                    previewLeft + width * previewBlockSize + previewBlockSize,
                    previewTop + height * previewBlockSize + previewBlockSize,
                    glowPaint
                )
                
                // Draw the held piece
                for (y in 0 until height) {
                    for (x in 0 until width) {
                        if (piece.isBlockAt(x, y)) {
                            val left = previewLeft + x * previewBlockSize
                            val top = previewTop + y * previewBlockSize
                            val right = left + previewBlockSize
                            val bottom = top + previewBlockSize
                            
                            // Draw outer glow
                            blockGlowPaint.color = Color.WHITE
                            canvas.drawRect(
                                left - 2f,
                                top - 2f,
                                right + 2f,
                                bottom + 2f,
                                blockGlowPaint
                            )
                            
                            // Draw block
                            blockPaint.color = Color.WHITE
                            canvas.drawRect(left, top, right, bottom, blockPaint)
                            
                            // Draw inner glow
                            glowPaint.color = Color.WHITE
                            canvas.drawRect(
                                left + 1f,
                                top + 1f,
                                right - 1f,
                                bottom - 1f,
                                glowPaint
                            )
                        }
                    }
                }
            }
        }
    }
} 