import { Controller, Get, Param, UseGuards, SetMetadata } from '@nestjs/common';
import { GameConfigService } from './game-config.service';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';

export const Public = () => SetMetadata('isPublic', true);

@UseGuards(JwtAuthGuard)
@Controller()
export class GameConfigController {
  constructor(private readonly gameConfigService: GameConfigService) {}

  @Public()
  @Get('health')
  health() {
    return { status: 'ok', timestamp: new Date().toISOString() };
  }

  // GET /api/v1/games — list all available games
  @Get('games')
  listGames() {
    return {
      success: true,
      data: this.gameConfigService.listGames(),
    };
  }

  // GET /api/v1/games/:gameName/config
  @Get('games/:gameName/config')
  getFullConfig(@Param('gameName') gameName: string) {
    return {
      success: true,
      data: this.gameConfigService.getFullConfig(gameName),
    };
  }

  // GET /api/v1/games/:gameName/grid
  @Get('games/:gameName/grid')
  getGrid(@Param('gameName') gameName: string) {
    return {
      success: true,
      data: this.gameConfigService.getGrid(gameName),
    };
  }

  // GET /api/v1/games/:gameName/symbols
  @Get('games/:gameName/symbols')
  getSymbols(@Param('gameName') gameName: string) {
    return {
      success: true,
      data: this.gameConfigService.getSymbols(gameName),
    };
  }

  // GET /api/v1/games/:gameName/paytable
  @Get('games/:gameName/paytable')
  getPayTable(@Param('gameName') gameName: string) {
    return {
      success: true,
      data: this.gameConfigService.getPayTable(gameName),
    };
  }

  // GET /api/v1/games/:gameName/rules
  @Get('games/:gameName/rules')
  getRules(@Param('gameName') gameName: string) {
    return {
      success: true,
      data: this.gameConfigService.getRules(gameName),
    };
  }

  // GET /api/v1/games/:gameName/options
  @Get('games/:gameName/options')
  getOptions(@Param('gameName') gameName: string) {
    return {
      success: true,
      data: this.gameConfigService.getOptions(gameName),
    };
  }

  // GET /api/v1/games/:gameName/states
  @Get('games/:gameName/states')
  getStates(@Param('gameName') gameName: string) {
    return {
      success: true,
      data: this.gameConfigService.getStates(gameName),
    };
  }

  // GET /api/v1/games/:gameName/wintypes
  @Get('games/:gameName/wintypes')
  getWinTypes(@Param('gameName') gameName: string) {
    return {
      success: true,
      data: this.gameConfigService.getWinTypes(gameName),
    };
  }

  // GET /api/v1/games/:gameName/mechanics
  @Get('games/:gameName/mechanics')
  getMechanics(@Param('gameName') gameName: string) {
    return {
      success: true,
      data: this.gameConfigService.getMechanics(gameName),
    };
  }

  // GET /api/v1/games/:gameName/modes
  @Get('games/:gameName/modes')
  getModes(@Param('gameName') gameName: string) {
    return {
      success: true,
      data: this.gameConfigService.getModes(gameName),
    };
  }
}
