import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  Query,
  ParseUUIDPipe,
  HttpCode,
} from '@nestjs/common';
import { StrategicObjectiveService } from '../services/strategic-objective.service';
import {
  CreateStrategicObjectiveDto,
  UpdateStrategicObjectiveDto,
  AssignStrategicObjectiveDto,
  QueryStrategicObjectiveDto,
} from '../dto/strategic-objective.dto';
import { CurrentUser } from '@common/decorators/current-user.decorator';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { PERFORMANCE_PERMISSIONS } from '../constants/permissions';

@Controller('performance/strategic-objectives')
export class StrategicObjectiveController {
  constructor(private readonly service: StrategicObjectiveService) {}

  @Get()
  @RequirePermissions(PERFORMANCE_PERMISSIONS.STRATEGIC_VIEW)
  async findAll(@Query() query: QueryStrategicObjectiveDto) {
    const items = await this.service.findAll(query);
    return { items };
  }

  @Get(':id')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.STRATEGIC_VIEW)
  async findById(@Param('id', ParseUUIDPipe) id: string) {
    return this.service.findById(id);
  }

  @Post()
  @RequirePermissions(PERFORMANCE_PERMISSIONS.STRATEGIC_CREATE)
  async create(
    @Body() dto: CreateStrategicObjectiveDto,
    @CurrentUser('userId') userId: string,
  ) {
    return this.service.create({ ...dto, createdBy: userId });
  }

  @Put(':id')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.STRATEGIC_UPDATE)
  async update(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: UpdateStrategicObjectiveDto,
  ) {
    return this.service.update(id, dto);
  }

  @Delete(':id')
  @HttpCode(204)
  @RequirePermissions(PERFORMANCE_PERMISSIONS.STRATEGIC_DELETE)
  async delete(@Param('id', ParseUUIDPipe) id: string) {
    await this.service.delete(id);
  }

  @Post(':id/assign')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.STRATEGIC_ASSIGN)
  async assign(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: AssignStrategicObjectiveDto,
  ) {
    return this.service.assign(id, dto.assigneeIds);
  }
}
