/**
 * 表单版本控制器
 * 完全符合 API 文档规范 v2.0 - 10个端点
 * 支持版本审核流程
 */

import {
  Controller,
  Get,
  Post,
  Patch,
  Delete,
  Body,
  Param,
  Query,
  ParseIntPipe,
  UseGuards,
  HttpCode,
  HttpStatus,
} from '@nestjs/common';
// import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger';  // TODO: Install @nestjs/swagger
import { PermissionsGuard } from '@modules/organization/auth/guards/permissions.guard';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { CurrentUser } from '@common/decorators/current-user.decorator';
import { Auditable, Sensitive } from '@core/observability/audit/decorators/auditable.decorator';
import { FormVersionService } from '../services';
import {
  CreateFormVersionDto,
  UpdateFormVersionDto,
  PublishFormVersionDto,
  SetDefaultVersionDto,
} from '../dto';
import {
  SubmitForReviewDto,
  ReviewVersionDto,
} from '../dto/form-version-review.dto';

// @ApiTags('Form Versions - 表单版本')
@Controller('forms/:formIdentifier/versions')
// @ApiBearerAuth()
export class FormVersionsController {
  constructor(private readonly formVersionService: FormVersionService) {}

  // ============================================
  // 2.1 创建新版本
  // ============================================

  @Post()
  @Auditable()
  @Sensitive()
  @RequirePermissions('form:version:create')
  // @ApiOperation({ summary: '创建新版本' })
  async create(
    @Param('formIdentifier') formIdentifier: string,
    @Body() dto: CreateFormVersionDto,
    @CurrentUser('userId') userId: string
  ) {
    return this.formVersionService.create(formIdentifier, dto, userId);
  }

  // ============================================
  // 2.2 获取所有版本
  // ============================================

  @Get()
  @RequirePermissions('form:read')
  // @ApiOperation({ summary: '获取所有版本' })
  async findAll(@Param('formIdentifier') formIdentifier: string) {
    return this.formVersionService.findAll(formIdentifier);
  }

  // ============================================
  // 2.10 版本对比 🆕 - 静态路由必须在动态路由之前
  // ============================================

  @Get('compare')
  @RequirePermissions('form:read')
  // @ApiOperation({ summary: '版本对比' })
  async compareVersions(
    @Param('formIdentifier') formIdentifier: string,
    @Query('from', ParseIntPipe) from: number,
    @Query('to', ParseIntPipe) to: number
  ) {
    return this.formVersionService.compareVersions(formIdentifier, from, to);
  }

  // ============================================
  // 2.3 获取指定版本
  // ============================================

  @Get(':version')
  @RequirePermissions('form:read')
  // @ApiOperation({ summary: '获取指定版本' })
  async findOne(
    @Param('formIdentifier') formIdentifier: string,
    @Param('version', ParseIntPipe) version: number
  ) {
    return this.formVersionService.findOne(formIdentifier, version);
  }

  // ============================================
  // 2.4 更新版本
  // ============================================

  @Patch(':version')
  @Auditable()
  @Sensitive()
  @RequirePermissions('form:version:update')
  // @ApiOperation({ summary: '更新版本' })
  async update(
    @Param('formIdentifier') formIdentifier: string,
    @Param('version', ParseIntPipe) version: number,
    @Body() dto: UpdateFormVersionDto
  ) {
    return this.formVersionService.update(formIdentifier, version, dto);
  }

  // ============================================
  // 2.5 发布版本
  // ============================================

  @Post(':version/publish')
  @Auditable()
  @Sensitive()
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:version:manage')
  // @ApiOperation({ summary: '发布版本' })
  async publish(
    @Param('formIdentifier') formIdentifier: string,
    @Param('version', ParseIntPipe) version: number,
    @Body() dto?: PublishFormVersionDto
  ) {
    return this.formVersionService.publish(formIdentifier, version, dto);
  }

  // ============================================
  // 2.6 废弃版本
  // ============================================

  @Post(':version/deprecate')
  @Auditable()
  @Sensitive()
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:version:manage')
  // @ApiOperation({ summary: '废弃版本' })
  async deprecate(
    @Param('formIdentifier') formIdentifier: string,
    @Param('version', ParseIntPipe) version: number
  ) {
    return this.formVersionService.deprecate(formIdentifier, version);
  }

  // ============================================
  // 2.7 设置默认版本
  // ============================================

  @Post('_actions/set-default')
  @Auditable()
  @Sensitive()
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:version:manage')
  // @ApiOperation({ summary: '设置默认版本' })
  async setDefault(
    @Param('formIdentifier') formIdentifier: string,
    @Body() dto: SetDefaultVersionDto
  ) {
    return this.formVersionService.setDefault(formIdentifier, dto);
  }

  // ============================================
  // 2.8 删除版本
  // ============================================

  @Delete(':version')
  @Auditable()
  @Sensitive()
  @RequirePermissions('form:version:delete')
  // @ApiOperation({ summary: '删除版本' })
  async remove(
    @Param('formIdentifier') formIdentifier: string,
    @Param('version', ParseIntPipe) version: number
  ) {
    return this.formVersionService.remove(formIdentifier, version);
  }

  // ============================================
  // 2.9 提交审核 🆕
  // ============================================

  @Post(':version/submit-review')
  @Auditable()
  @Sensitive()
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:design')
  // @ApiOperation({ summary: '提交审核' })
  async submitForReview(
    @Param('formIdentifier') formIdentifier: string,
    @Param('version', ParseIntPipe) version: number,
    @Body() dto: SubmitForReviewDto,
    @CurrentUser('userId') userId: string
  ) {
    return this.formVersionService.submitForReview(
      formIdentifier,
      version,
      dto,
      userId
    );
  }

  // ============================================
  // 2.10 审核版本（通过/驳回）🆕
  // ============================================

  @Post(':version/review')
  @Auditable()
  @Sensitive()
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:admin')
  // @ApiOperation({ summary: '审核版本（通过/驳回）' })
  async reviewVersion(
    @Param('formIdentifier') formIdentifier: string,
    @Param('version', ParseIntPipe) version: number,
    @Body() dto: ReviewVersionDto,
    @CurrentUser('userId') userId: string
  ) {
    return this.formVersionService.reviewVersion(
      formIdentifier,
      version,
      dto,
      userId
    );
  }

}

