import { Controller, Get, Post, Delete, Body, Param, Headers, UseGuards, Request } from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation, ApiHeader } from '@nestjs/swagger';
import { DevicesService } from './devices.service';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { IsString, IsArray, IsOptional, IsBoolean, IsInt } from 'class-validator';

class SyncDto {
  @IsInt() currentPolicyVersion: number;
}

class InstalledAppDto {
  @IsString() packageName: string;
  @IsString() appName: string;
  @IsOptional() @IsBoolean() isSystem?: boolean;
}

class ReportAppsDto {
  @IsArray() apps: InstalledAppDto[];
}

class SyncEventItemDto {
  @IsString() eventType: string;
  payload: any;
  @IsString() occurredAt: string;
}

class PushSyncEventsDto {
  @IsArray() events: SyncEventItemDto[];
}

class UpdateFcmDto {
  @IsString() fcmToken: string;
}

@ApiTags('devices')
@Controller({ path: 'devices', version: '1' })
export class DevicesController {
  constructor(private readonly service: DevicesService) {}

  /** Endpoint para o app do filho autenticar via device token */
  @Post('auth')
  @ApiOperation({ summary: 'Autenticar dispositivo' })
  @ApiHeader({ name: 'X-Device-Token', required: true })
  authenticate(@Headers('x-device-token') token: string) {
    return this.service.authenticateDevice(token);
  }

  @Post(':id/sync')
  @ApiOperation({ summary: 'Sync da policy' })
  @ApiHeader({ name: 'X-Device-Token', required: true })
  sync(@Param('id') id: string, @Body() dto: SyncDto) {
    return this.service.syncDevice(id, dto.currentPolicyVersion);
  }

  @Post(':id/apps')
  @ApiOperation({ summary: 'Reportar apps instalados' })
  reportApps(@Param('id') id: string, @Body() dto: ReportAppsDto) {
    return this.service.reportInstalledApps(id, dto.apps);
  }

  @Post(':id/events')
  @ApiOperation({ summary: 'Push de eventos offline' })
  pushEvents(@Param('id') id: string, @Body() dto: PushSyncEventsDto) {
    return this.service.pushSyncEvents(id, dto.events);
  }

  @Post(':id/fcm-token')
  @ApiOperation({ summary: 'Atualizar FCM token' })
  updateFcm(@Param('id') id: string, @Body() dto: UpdateFcmDto) {
    return this.service.updateFcmToken(id, dto.fcmToken);
  }

  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard)
  @Get('child/:childId')
  @ApiOperation({ summary: 'Dispositivos da criança' })
  list(@Param('childId') childId: string) {
    return this.service.getDevicesForChild(childId);
  }

  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard)
  @Delete(':id')
  @ApiOperation({ summary: 'Desativar dispositivo' })
  deactivate(@Param('id') id: string) {
    return this.service.deactivateDevice(id);
  }
}
