import {
  Controller,
  Get,
  Post,
  Patch,
  Delete,
  Body,
  Param,
  Query,
  ParseUUIDPipe,
} from '@nestjs/common';
import { Evaluation360TemplateService } from '../services/evaluation360-template.service';
import {
  CreateEvaluation360TemplateDto,
  UpdateEvaluation360TemplateDto,
  QueryEvaluation360TemplateDto,
} from '../dto/evaluation360-template.dto';
import { CurrentUser } from '@common/decorators/current-user.decorator';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { PERFORMANCE_PERMISSIONS } from '../constants/permissions';

/**
 * 360 评估模板控制器
 * 路由前缀: /api/v1/performance/360-templates
 */
@Controller('performance/360-templates')
export class Evaluation360TemplateController {
  constructor(
    private readonly evaluation360TemplateService: Evaluation360TemplateService,
  ) {}

  /**
   * 获取当前用户适用的模板
   * 注意：必须在 :id 路由之前，否则 "applicable" 会被当 UUID 解析
   */
  @Get('applicable')
  async findApplicable(
    @CurrentUser('userId') userId: string,
    @Query('cycleId') cycleId?: string,
  ) {
    return this.evaluation360TemplateService.findApplicable(userId, cycleId);
  }

  @Get()
  @RequirePermissions(PERFORMANCE_PERMISSIONS.E360_TEMPLATE_VIEW)
  async findAll(@Query() query: QueryEvaluation360TemplateDto) {
    return this.evaluation360TemplateService.findAll({
      organizationId: query.organizationId,
    });
  }

  @Post()
  @RequirePermissions(PERFORMANCE_PERMISSIONS.E360_TEMPLATE_CREATE)
  async create(
    @Body() dto: CreateEvaluation360TemplateDto,
    @CurrentUser('userId') userId: string,
  ) {
    const template = await this.evaluation360TemplateService.create(
      {
        name: dto.name,
        description: dto.description,
        dimensions: dto.dimensions,
        relationshipTypes: dto.relationshipTypes,
        isDefault: dto.isDefault,
        organizationId: dto.organizationId,
        cycleId: dto.cycleId,
        scope: dto.scope,
      },
      userId,
    );
    return template;
  }

  @Patch(':id')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.E360_TEMPLATE_UPDATE)
  async update(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: UpdateEvaluation360TemplateDto,
  ) {
    return this.evaluation360TemplateService.update(id, {
      name: dto.name,
      description: dto.description,
      dimensions: dto.dimensions,
      relationshipTypes: dto.relationshipTypes,
      isDefault: dto.isDefault,
      isActive: dto.isActive,
      organizationId: dto.organizationId,
      cycleId: dto.cycleId,
      scope: dto.scope,
    });
  }

  @Delete(':id')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.E360_TEMPLATE_DELETE)
  async delete(@Param('id', ParseUUIDPipe) id: string) {
    await this.evaluation360TemplateService.delete(id);
    return { id };
  }

  @Patch(':id/set-default')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.E360_TEMPLATE_UPDATE)
  async setDefault(@Param('id', ParseUUIDPipe) id: string) {
    const template = await this.evaluation360TemplateService.setDefault(id);
    return { id: template.id, isDefault: template.isDefault };
  }
}
