import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  Query,
  ParseUUIDPipe,
  HttpCode,
} from '@nestjs/common';
import { GradeConfigService, GradeDefinition } from '../services/grade-config.service';
import { CreateGradeConfigDto, UpdateGradeConfigDto } from '../dto/grade-config.dto';
import { CurrentUser } from '@common/decorators/current-user.decorator';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { PERFORMANCE_PERMISSIONS } from '../constants/permissions';

/**
 * 等级配置控制器
 * 路由前缀: /api/v1/performance/grade-configs
 */
@Controller('performance/grade-configs')
export class GradeConfigController {
  constructor(private readonly gradeConfigService: GradeConfigService) {}

  @Get()
  @RequirePermissions(PERFORMANCE_PERMISSIONS.GRADE_VIEW)
  async findAll(@Query('isActive') isActive?: boolean) {
    return this.gradeConfigService.findAll({ isActive });
  }

  @Get('default')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.GRADE_VIEW)
  async findDefault() {
    const config = await this.gradeConfigService.findDefault();
    const { cycles, ...rest } = config as any;
    return rest;
  }

  @Get('select')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.GRADE_VIEW)
  async getGradesForSelect() {
    return this.gradeConfigService.getGradesForSelect();
  }

  @Get(':id')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.GRADE_VIEW)
  async findById(@Param('id', ParseUUIDPipe) id: string) {
    const config = await this.gradeConfigService.findById(id);
    const { cycles, ...rest } = config as any;
    return rest;
  }

  @Post()
  @RequirePermissions(PERFORMANCE_PERMISSIONS.GRADE_CREATE)
  async create(
    @Body() dto: CreateGradeConfigDto,
    @CurrentUser('userId') userId: string,
  ) {
    const grades: GradeDefinition[] = dto.grades.map((g, index) => ({
      code: g.code,
      name: g.name,
      minScore: g.minScore,
      maxScore: g.maxScore,
      color: g.color || '#9ca3af',
      order: index + 1,
    }));

    const config = await this.gradeConfigService.create({
      name: dto.name,
      description: dto.description,
      grades,
      isDefault: dto.isDefault,
      createdBy: userId,
    });
    return config;
  }

  @Put(':id')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.GRADE_UPDATE)
  async update(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: UpdateGradeConfigDto,
  ) {
    let grades: GradeDefinition[] | undefined;
    if (dto.grades) {
      grades = dto.grades.map((g, index) => ({
        code: g.code,
        name: g.name,
        minScore: g.minScore,
        maxScore: g.maxScore,
        color: g.color || '#9ca3af',
        order: index + 1,
      }));
    }

    const config = await this.gradeConfigService.update(id, {
      name: dto.name,
      description: dto.description,
      grades,
      isActive: dto.isActive,
    });
    return config;
  }

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

  @Post(':id/set-default')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.GRADE_UPDATE)
  @HttpCode(200)
  async setDefault(@Param('id', ParseUUIDPipe) id: string) {
    const config = await this.gradeConfigService.setDefault(id);
    const { cycles, ...rest } = config as any;
    return rest;
  }

  @Post('validate')
  @RequirePermissions(PERFORMANCE_PERMISSIONS.GRADE_VIEW)
  @HttpCode(200)
  async validateGrades(@Body('grades') grades: GradeDefinition[]) {
    const result = this.gradeConfigService.validateGrades(grades);
    return { valid: result.valid, message: result.error };
  }
}
