import { Controller, Get, Post, Patch, Body, Param, UseGuards, Request } from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
import { ChildrenService, CreateChildDto } from './children.service';
import { PairingService } from './pairing.service';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { IsString, IsOptional, IsEnum } from 'class-validator';
import { DeviceOS } from '@prisma/client';
import { ApiProperty } from '@nestjs/swagger';

class CompletePairingDto {
  @ApiProperty() @IsString() code: string;
  @ApiProperty() @IsString() deviceName: string;
  @ApiProperty({ enum: DeviceOS }) @IsEnum(DeviceOS) os: DeviceOS;
  @IsOptional() @IsString() osVersion?: string;
}

@ApiTags('children')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
@Controller({ path: 'children', version: '1' })
export class ChildrenController {
  constructor(
    private readonly service: ChildrenService,
    private readonly pairing: PairingService,
  ) {}

  @Post()
  @ApiOperation({ summary: 'Criar perfil de filho' })
  create(@Body() dto: CreateChildDto, @Request() req: any) {
    return this.service.createChild(req.user.sub, dto);
  }

  @Get(':id')
  @ApiOperation({ summary: 'Detalhe do filho' })
  get(@Param('id') id: string) {
    return this.service.getChild(id);
  }

  @Get(':id/profile')
  @ApiOperation({ summary: 'Perfil para app do filho' })
  profile(@Param('id') id: string) {
    return this.service.getChildProfile(id);
  }

  @Post(':id/pairing-code')
  @ApiOperation({ summary: 'Gerar código de pareamento' })
  generateCode(@Param('id') id: string, @Request() req: any) {
    return this.pairing.generatePairingCode(id, req.user.sub);
  }

  @Post('pair')
  @ApiOperation({ summary: 'Completar pareamento de dispositivo' })
  completePairing(@Body() dto: CompletePairingDto) {
    return this.pairing.completePairing(dto.code, dto.deviceName, dto.os, dto.osVersion);
  }
}
