import {
  Controller, Get, Post, Body, Param, Query, UseGuards, Request
} from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
import { MissionsService } from './missions.service';
import { QuizEngineService } from './quiz-engine.service';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { IsString, IsArray, IsOptional, IsInt, Min } from 'class-validator';
import { ApiProperty } from '@nestjs/swagger';

class SubmitAnswerItemDto {
  @IsString() questionId: string;
  @IsOptional() @IsArray() selectedOptionIds?: string[];
  @IsOptional() @IsString() textAnswer?: string;
  @IsOptional() @IsInt() responseTimeSec?: number;
}

class SubmitAttemptDto {
  @IsArray() answers: SubmitAnswerItemDto[];
  @IsInt() @Min(0) durationSec: number;
}

class AssignMissionDto {
  @ApiProperty() @IsString() missionId: string;
  @ApiProperty() @IsString() childId: string;
}

@ApiTags('missions')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
@Controller({ path: 'missions', version: '1' })
export class MissionsController {
  constructor(
    private readonly service: MissionsService,
    private readonly quiz: QuizEngineService,
  ) {}

  @Get()
  @ApiOperation({ summary: 'Listar missões publicadas' })
  list(@Query('childId') childId?: string, @Query('subjectId') subjectId?: string) {
    return this.service.listPublished(childId, subjectId);
  }

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

  @Get(':id')
  @ApiOperation({ summary: 'Detalhe de missão' })
  get(@Param('id') id: string) { return this.service.getMission(id); }

  @Post('assign')
  @ApiOperation({ summary: 'Atribuir missão a uma criança' })
  assign(@Body() dto: AssignMissionDto, @Request() req: any) {
    return this.service.assignMission(dto.childId, dto.missionId, req.user.sub);
  }

  @Get('child/:childId/assignments')
  @ApiOperation({ summary: 'Missões da criança' })
  childAssignments(@Param('childId') childId: string) {
    return this.service.getChildAssignments(childId);
  }

  @Get('child/:childId/skills')
  @ApiOperation({ summary: 'Progresso de habilidades da criança' })
  skillProgress(@Param('childId') childId: string) {
    return this.service.getSkillProgress(childId);
  }

  @Post('assignment/:assignmentId/start')
  @ApiOperation({ summary: 'Iniciar tentativa de missão' })
  startAttempt(@Param('assignmentId') assignmentId: string, @Request() req: any) {
    return this.quiz.startAttempt(req.user.sub, assignmentId);
  }

  @Post('attempt/:attemptId/submit')
  @ApiOperation({ summary: 'Submeter respostas da tentativa' })
  submitAttempt(
    @Param('attemptId') attemptId: string,
    @Body() dto: SubmitAttemptDto,
    @Request() req: any,
  ) {
    return this.quiz.submitAttempt(req.user.sub, attemptId, dto.answers, dto.durationSec);
  }
}
