import random
from flask import request

from auth import require_user
from db import update_balance, get_game_settings


active_mines_games = {}
GRID_SIZE = 49  # 7x7 grid


def start():
    user = require_user()
    data = request.json or {}

    bet = float(data.get("bet", 0))
    mines_count = int(data.get("mines", 0))

    settings = get_game_settings("mines")
    if not settings or not settings["enabled"]:
        return {"error": "Game disabled"}

    if bet < settings["min_bet"] or bet > settings["max_bet"]:
        return {"error": "Invalid bet amount"}

    if mines_count < 1 or mines_count >= GRID_SIZE:
        return {"error": "Invalid number of mines"}

    update_balance(user["id"], -bet)

    grid = [0] * GRID_SIZE
    for i in random.sample(range(GRID_SIZE), mines_count):
        grid[i] = 1

    active_mines_games[user["id"]] = {
        "grid": grid,
        "bet": bet,
        "revealed": set(),
        "multiplier": 1.0
    }

    return {"success": True}


def reveal():
    user = require_user()
    data = request.json or {}
    index = int(data.get("index", -1))

    if user["id"] not in active_mines_games:
        return {"error": "No active game"}

    game = active_mines_games[user["id"]]

    if index < 0 or index >= GRID_SIZE:
        return {"error": "Invalid index"}

    if index in game["revealed"]:
        return {"error": "Already revealed"}

    if game["grid"][index] == 1:
        del active_mines_games[user["id"]]
        return {"mine": True}

    game["revealed"].add(index)
    game["multiplier"] += 0.22

    return {"mine": False}


def cashout():
    user = require_user()

    if user["id"] not in active_mines_games:
        return {"error": "No active game"}

    game = active_mines_games.pop(user["id"])
    win_amount = round(game["bet"] * game["multiplier"], 2)
    update_balance(user["id"], win_amount)

    return {"win": win_amount}
