/**
 * 快照控制器
 * 
 * 版本审核与发布、快照管理 API
 */

import {
  Controller,
  Get,
  Post,
  Body,
  Param,
  Query,
  UseGuards,
  Logger,
  HttpCode,
} from '@nestjs/common';
import {
  ApiTags,
  ApiOperation,
  ApiResponse,
  ApiBearerAuth,
  ApiHeader,
  ApiParam,
} from '@nestjs/swagger';
import { SnapshotService } from '../services/snapshot.service';
import { VersionDiffService } from '../services/version-diff.service';
import { RegionGuard } from '../guards/region.guard';
import { Region, RegionRequired } from '../decorators/region.decorator';
import type { RegionId } from '../decorators/region.decorator';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { CurrentUser } from '@common/decorators/current-user.decorator';
import { PermissionsGuard } from '@modules/organization/auth/guards/permissions.guard';
import {
  SubmitReviewDto,
  ReviewSnapshotDto,
  PublishSnapshotDto,
} from '../dto/snapshot.dto';
import { VersionDiffQueryDto } from '../dto/query.dto';
import { Auditable, Sensitive, Financial } from '@core/observability/audit/decorators/auditable.decorator';

@ApiTags('快照与版本管理')
@ApiBearerAuth()
@ApiHeader({
  name: 'X-Region-Id',
  description: '区域标识（CN / US / ME）',
  required: true,
})
@Controller('form-management')
@UseGuards(RegionGuard, PermissionsGuard)
@RegionRequired(true)
export class SnapshotController {
  private readonly logger = new Logger(SnapshotController.name);

  constructor(
    private readonly snapshotService: SnapshotService,
    private readonly versionDiffService: VersionDiffService,
  ) {}

  // ============================================
  // 版本审核与发布
  // ============================================

  @Post('definitions/:id/submit-review')
  @Auditable()
  @Sensitive()
  @HttpCode(200)
  @ApiOperation({ summary: '提交审核' })
  @ApiParam({ name: 'id', description: '表单定义 ID' })
  @ApiResponse({ status: 200, description: '提交成功' })
  @ApiResponse({ status: 409, description: '已有待审核版本' })
  @RequirePermissions('form:design')
  async submitReview(
    @Param('id') id: string,
    @Body() dto: SubmitReviewDto,
    @Region() regionId: RegionId,
    @CurrentUser('userId') userId: string,
  ) {
    this.logger.log(`POST /definitions/${id}/submit-review - region: ${regionId}, user: ${userId}`);
    return this.snapshotService.submitReview(id, dto, regionId, userId);
  }

  @Get('snapshots/pending')
  @ApiOperation({ summary: '获取待审核列表' })
  @ApiResponse({ status: 200, description: '成功获取列表' })
  @RequirePermissions('form:review')
  async getPendingReviews(@Region() regionId: RegionId) {
    this.logger.log(`GET /snapshots/pending - region: ${regionId}`);
    return this.snapshotService.getPendingReviews(regionId);
  }

  @Post('snapshots/:snapshotId/review')
  @Auditable()
  @Sensitive()
  @HttpCode(200)
  @ApiOperation({ summary: '审核（通过/驳回）' })
  @ApiParam({ name: 'snapshotId', description: '快照 ID' })
  @ApiResponse({ status: 200, description: '审核成功' })
  @RequirePermissions('form:review')
  async review(
    @Param('snapshotId') snapshotId: string,
    @Body() dto: ReviewSnapshotDto,
    @Region() regionId: RegionId,
    @CurrentUser('userId') userId: string,
  ) {
    this.logger.log(`POST /snapshots/${snapshotId}/review - region: ${regionId}, user: ${userId}`);
    return this.snapshotService.review(snapshotId, dto, regionId, userId);
  }

  @Post('snapshots/:snapshotId/publish')
  @Auditable()
  @Sensitive()
  @HttpCode(200)
  @ApiOperation({ summary: '发布' })
  @ApiParam({ name: 'snapshotId', description: '快照 ID' })
  @ApiResponse({ status: 200, description: '发布成功' })
  @RequirePermissions('form:publish')
  async publish(
    @Param('snapshotId') snapshotId: string,
    @Body() dto: PublishSnapshotDto,
    @Region() regionId: RegionId,
    @CurrentUser('userId') userId: string,
  ) {
    this.logger.log(`POST /snapshots/${snapshotId}/publish - region: ${regionId}, user: ${userId}`);
    return this.snapshotService.publish(snapshotId, dto, regionId, userId);
  }

  @Post('snapshots/:snapshotId/rollback')
  @Auditable()
  @Sensitive()
  @HttpCode(200)
  @ApiOperation({ summary: '回滚到指定快照' })
  @ApiParam({ name: 'snapshotId', description: '快照 ID' })
  @ApiResponse({ status: 200, description: '回滚成功' })
  @ApiResponse({ status: 404, description: '快照不存在' })
  @ApiResponse({ status: 409, description: '快照状态不允许回滚' })
  @RequirePermissions('form:publish')
  async rollback(
    @Param('snapshotId') snapshotId: string,
    @Region() regionId: RegionId,
    @CurrentUser('userId') userId: string,
  ) {
    this.logger.log(`POST /snapshots/${snapshotId}/rollback - region: ${regionId}, user: ${userId}`);
    return this.snapshotService.rollback(snapshotId, regionId, userId);
  }

  // ============================================
  // 快照查询
  // ============================================

  @Get('definitions/:id/active-snapshot')
  @ApiOperation({ summary: '获取当前激活快照' })
  @ApiParam({ name: 'id', description: '表单定义 ID' })
  @ApiResponse({ status: 200, description: '成功获取快照' })
  @ApiResponse({ status: 404, description: '没有激活的快照' })
  @RequirePermissions('form:read')
  async getActiveSnapshot(
    @Param('id') id: string,
    @Region() regionId: RegionId,
  ) {
    this.logger.log(`GET /definitions/${id}/active-snapshot - region: ${regionId}`);
    return this.snapshotService.getActiveSnapshot(id, regionId);
  }

  @Get('definitions/:id/snapshots')
  @ApiOperation({ summary: '获取快照历史' })
  @ApiParam({ name: 'id', description: '表单定义 ID' })
  @ApiResponse({ status: 200, description: '成功获取历史' })
  @RequirePermissions('form:read')
  async getSnapshotHistory(
    @Param('id') id: string,
    @Region() regionId: RegionId,
  ) {
    this.logger.log(`GET /definitions/${id}/snapshots - region: ${regionId}`);
    return this.snapshotService.getSnapshotHistory(id, regionId);
  }

  @Get('snapshots/:snapshotId')
  @ApiOperation({ summary: '获取快照详情' })
  @ApiParam({ name: 'snapshotId', description: '快照 ID' })
  @ApiResponse({ status: 200, description: '成功获取详情' })
  @RequirePermissions('form:read')
  async getSnapshotDetail(
    @Param('snapshotId') snapshotId: string,
    @Region() regionId: RegionId,
  ) {
    this.logger.log(`GET /snapshots/${snapshotId} - region: ${regionId}`);
    return this.snapshotService.getSnapshotDetail(snapshotId, regionId);
  }

  // ============================================
  // 版本对比
  // ============================================

  @Get('definitions/:id/versions/diff')
  @ApiOperation({ summary: '对比两个版本的差异' })
  @ApiParam({ name: 'id', description: '表单定义 ID' })
  @ApiResponse({ status: 200, description: '成功获取差异' })
  @RequirePermissions('form:read')
  async compareVersions(
    @Param('id') id: string,
    @Query() query: VersionDiffQueryDto,
    @Region() regionId: RegionId,
  ) {
    this.logger.log(`GET /definitions/${id}/versions/diff - from: ${query.from}, to: ${query.to}`);
    return this.versionDiffService.compareVersions(id, query, regionId);
  }

  @Get('snapshots/:id1/diff/:id2')
  @ApiOperation({ summary: '对比两个快照的差异' })
  @ApiParam({ name: 'id1', description: '快照 ID 1（较旧版本）' })
  @ApiParam({ name: 'id2', description: '快照 ID 2（较新版本）' })
  @ApiResponse({ status: 200, description: '成功获取差异' })
  @RequirePermissions('form:read')
  async compareSnapshots(
    @Param('id1') id1: string,
    @Param('id2') id2: string,
    @Region() regionId: RegionId,
  ) {
    this.logger.log(`GET /snapshots/${id1}/diff/${id2}`);
    return this.versionDiffService.compareSnapshots(id1, id2, regionId);
  }
}
