import {
  Controller, Get, Post, Put, Delete,
  Body, Param, UseGuards, Request
} from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import {
  PoliciesService,
  UpsertAppLimitDto,
  UpsertCategoryLimitDto,
  UpsertScheduleDto,
  UpsertRoutineDto,
} from './policies.service';

@ApiTags('policies')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
@Controller({ path: 'policies', version: '1' })
export class PoliciesController {
  constructor(private readonly service: PoliciesService) {}

  @Get('child/:childId')
  @ApiOperation({ summary: 'Política completa da criança' })
  getPolicy(@Param('childId') childId: string) {
    return this.service.getPolicy(childId);
  }

  @Get('child/:childId/device-sync')
  @ApiOperation({ summary: 'Policy para sync no dispositivo' })
  getForDevice(@Param('childId') childId: string) {
    return this.service.getPolicyForDevice(childId);
  }

  @Post('child/:childId/app-limits')
  @ApiOperation({ summary: 'Criar/atualizar limite de app' })
  upsertAppLimit(
    @Param('childId') childId: string,
    @Body() dto: UpsertAppLimitDto,
    @Request() req: any,
  ) {
    return this.service.upsertAppLimit(childId, dto, req.user.sub);
  }

  @Delete('child/:childId/app-limits/:packageName')
  @ApiOperation({ summary: 'Remover limite de app' })
  removeAppLimit(
    @Param('childId') childId: string,
    @Param('packageName') packageName: string,
    @Request() req: any,
  ) {
    return this.service.removeAppLimit(childId, packageName, req.user.sub);
  }

  @Post('child/:childId/category-limits')
  @ApiOperation({ summary: 'Criar/atualizar limite de categoria' })
  upsertCategoryLimit(
    @Param('childId') childId: string,
    @Body() dto: UpsertCategoryLimitDto,
    @Request() req: any,
  ) {
    return this.service.upsertCategoryLimit(childId, dto, req.user.sub);
  }

  @Post('child/:childId/schedules')
  @ApiOperation({ summary: 'Criar horário' })
  createSchedule(
    @Param('childId') childId: string,
    @Body() dto: UpsertScheduleDto,
    @Request() req: any,
  ) {
    return this.service.upsertSchedule(childId, dto, req.user.sub);
  }

  @Put('schedules/:id')
  @ApiOperation({ summary: 'Atualizar horário' })
  updateSchedule(
    @Param('id') id: string,
    @Body() dto: Partial<UpsertScheduleDto>,
    @Request() req: any,
  ) {
    return this.service.updateSchedule(id, dto, req.user.sub);
  }

  @Delete('schedules/:id')
  @ApiOperation({ summary: 'Remover horário' })
  deleteSchedule(@Param('id') id: string, @Request() req: any) {
    return this.service.deleteSchedule(id, req.user.sub);
  }

  @Post('child/:childId/routines')
  @ApiOperation({ summary: 'Criar rotina' })
  createRoutine(
    @Param('childId') childId: string,
    @Body() dto: UpsertRoutineDto,
    @Request() req: any,
  ) {
    return this.service.upsertRoutine(childId, dto, req.user.sub);
  }

  @Put('routines/:id')
  @ApiOperation({ summary: 'Atualizar rotina' })
  updateRoutine(
    @Param('id') id: string,
    @Body() dto: Partial<UpsertRoutineDto>,
    @Request() req: any,
  ) {
    return this.service.updateRoutine(id, dto, req.user.sub);
  }
}
