import { Controller, Get, Post, Patch, Body, Param, Query, UseGuards } from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
import { AdminService } from './admin.service';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { Roles } from '../../common/decorators/roles.decorator';
import { RolesGuard } from '../../common/guards/roles.guard';
import { UserRole, MissionStatus } from '@prisma/client';
import { IsString, IsOptional } from 'class-validator';

class CreateSubjectDto {
  @IsString() name: string;
  @IsOptional() @IsString() nameEn?: string;
  @IsString() slug: string;
  @IsOptional() @IsString() emoji?: string;
  @IsOptional() @IsString() color?: string;
}

class CreateSkillDto {
  @IsString() subjectId: string;
  @IsString() name: string;
  @IsString() slug: string;
  @IsOptional() @IsString() parentId?: string;
  @IsOptional() @IsString() description?: string;
}

@ApiTags('admin')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(UserRole.ADMIN)
@Controller({ path: 'admin', version: '1' })
export class AdminController {
  constructor(private readonly service: AdminService) {}

  @Get('stats')
  @ApiOperation({ summary: 'Estatísticas gerais' })
  stats() { return this.service.getStats(); }

  @Get('families')
  @ApiOperation({ summary: 'Listar famílias' })
  families(@Query('page') page = 1, @Query('limit') limit = 20) {
    return this.service.listFamilies(+page, +limit);
  }

  @Get('missions')
  @ApiOperation({ summary: 'Listar missões' })
  missions(@Query('page') page = 1, @Query('limit') limit = 20) {
    return this.service.listMissions(+page, +limit);
  }

  @Patch('missions/:id/status')
  @ApiOperation({ summary: 'Alterar status de missão' })
  missionStatus(@Param('id') id: string, @Body('status') status: MissionStatus) {
    return this.service.updateMissionStatus(id, status);
  }

  @Get('subjects')
  @ApiOperation({ summary: 'Listar matérias' })
  subjects() { return this.service.listSubjects(); }

  @Post('subjects')
  @ApiOperation({ summary: 'Criar matéria' })
  createSubject(@Body() dto: CreateSubjectDto) { return this.service.createSubject(dto); }

  @Get('skills')
  @ApiOperation({ summary: 'Listar habilidades' })
  skills(@Query('subjectId') subjectId?: string) { return this.service.listSkills(subjectId); }

  @Post('skills')
  @ApiOperation({ summary: 'Criar habilidade' })
  createSkill(@Body() dto: CreateSkillDto) { return this.service.createSkill(dto); }

  @Get('audit-logs')
  @ApiOperation({ summary: 'Logs de auditoria' })
  auditLogs(@Query('page') page = 1, @Query('limit') limit = 50) {
    return this.service.getAuditLogs(+page, +limit);
  }
}
