/**
 * 表单定义控制器
 * 完全符合 API 文档规范 - 14个端点
 */

import {
  Controller,
  Get,
  Post,
  Patch,
  Delete,
  Body,
  Param,
  Query,
  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 { FormDefinitionService } from '../services';
import {
  CreateFormDefinitionDto,
  UpdateFormDefinitionDto,
  QueryFormDefinitionDto,
  PublishFormDefinitionDto,
  ArchiveFormDefinitionDto,
  CopyFormDefinitionDto,
} from '../dto';
import { Auditable, Sensitive } from '@core/observability/audit/decorators/auditable.decorator';

// @ApiTags('Forms - 表单定义')
@Controller('forms')
// @ApiBearerAuth()
export class FormsController {
  constructor(
    private readonly formDefinitionService: FormDefinitionService
  ) {}

  // ============================================
  // 1.1 创建表单定义
  // ============================================

  @Post()
  @Auditable()
  @RequirePermissions('form:create')
  // @ApiOperation({ summary: '创建表单定义' })
  async create(
    @Body() dto: CreateFormDefinitionDto,
    @CurrentUser('userId') userId: string
  ) {
    return this.formDefinitionService.create(dto, userId);
  }

  // ============================================
  // 1.2 获取表单定义列表
  // ============================================

  @Get()
  @RequirePermissions('form:read')
  // @ApiOperation({ summary: '获取表单定义列表' })
  async findAll(
    @Query() query: QueryFormDefinitionDto,
    @CurrentUser('userId') userId: string
  ) {
    return this.formDefinitionService.findAll(query, userId);
  }

  // ============================================
  // 1.3 获取单个表单定义
  // ============================================

  @Get(':formIdentifier')
  @RequirePermissions('form:read')
  // @ApiOperation({ summary: '获取单个表单定义' })
  async findOne(@Param('formIdentifier') formIdentifier: string) {
    return this.formDefinitionService.findOne(formIdentifier);
  }

  // ============================================
  // 1.4 获取表单定义（带默认版本）
  // ============================================

  @Get(':formIdentifier/with-default')
  @RequirePermissions('form:read')
  // @ApiOperation({ summary: '获取表单定义（带默认版本）' })
  async findOneWithDefault(@Param('formIdentifier') formIdentifier: string) {
    return this.formDefinitionService.findOneWithDefaultVersion(
      formIdentifier
    );
  }

  // ============================================
  // 1.5 更新表单定义
  // ============================================

  @Patch(':formIdentifier')
  @Auditable()
  @RequirePermissions('form:update')
  // @ApiOperation({ summary: '更新表单定义' })
  async update(
    @Param('formIdentifier') formIdentifier: string,
    @Body() dto: UpdateFormDefinitionDto,
    @CurrentUser('userId') userId: string
  ) {
    return this.formDefinitionService.update(formIdentifier, dto, userId);
  }

  // ============================================
  // 1.6 删除表单定义
  // ============================================

  @Delete(':formIdentifier')
  @Auditable()
  @Sensitive()
  @RequirePermissions('form:delete')
  // @ApiOperation({ summary: '删除表单定义' })
  async remove(@Param('formIdentifier') formIdentifier: string) {
    return this.formDefinitionService.remove(formIdentifier);
  }

  // ============================================
  // 1.7 归档表单定义
  // ============================================

  @Post(':formIdentifier/archive')
  @Auditable()
  @Sensitive()
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:update')
  // @ApiOperation({ summary: '归档表单定义' })
  async archive(
    @Param('formIdentifier') formIdentifier: string,
    @Body() dto?: ArchiveFormDefinitionDto
  ) {
    return this.formDefinitionService.archive(formIdentifier, dto);
  }

  // ============================================
  // 1.8 恢复表单定义（取消归档）
  // ============================================

  @Post(':formIdentifier/unarchive')
  @Auditable()
  @Sensitive()
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:update')
  // @ApiOperation({ summary: '恢复表单定义' })
  async unarchive(
    @Param('formIdentifier') formIdentifier: string,
    @CurrentUser('userId') userId: string
  ) {
    // 通过更新 status 为 DRAFT 来恢复
    return this.formDefinitionService.update(
      formIdentifier,
      { status: 'DRAFT' } as any,
      userId
    );
  }

  // ============================================
  // 1.8 更新 Slug
  // ============================================

  @Patch(':formIdentifier/slug')
  @Auditable()
  @RequirePermissions('form:update')
  // @ApiOperation({ summary: '更新表单 Slug' })
  async updateSlug(
    @Param('formIdentifier') formIdentifier: string,
    @Body('newSlug') newSlug: string,
    @CurrentUser('userId') userId: string
  ) {
    return this.formDefinitionService.updateSlug(formIdentifier, newSlug, userId);
  }

  // ============================================
  // 1.9 添加别名
  // ============================================

  @Post(':formIdentifier/aliases')
  @Auditable()
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:update')
  // @ApiOperation({ summary: '添加表单别名' })
  async addAliases(
    @Param('formIdentifier') formIdentifier: string,
    @Body('aliases') aliases: string[],
    @CurrentUser('userId') userId: string
  ) {
    return this.formDefinitionService.addAliases(formIdentifier, aliases, userId);
  }

  // ============================================
  // 1.10 删除别名
  // ============================================

  @Delete(':formIdentifier/aliases/:alias')
  @Auditable()
  @Sensitive()
  @RequirePermissions('form:update')
  // @ApiOperation({ summary: '删除表单别名' })
  async removeAlias(
    @Param('formIdentifier') formIdentifier: string,
    @Param('alias') alias: string,
    @CurrentUser('userId') userId: string
  ) {
    return this.formDefinitionService.removeAlias(formIdentifier, alias, userId);
  }

  // ============================================
  // 1.12 获取表单统计信息 🔒 Admin Only
  // ============================================

  @Get(':formIdentifier/stats')
  @RequirePermissions('form:read:all')
  // @ApiOperation({
  //   summary: '获取表单统计信息（管理员）',
  //   description: '🔐 Admin Only - 此接口仅管理员可访问',
  // })
  async getStats(@Param('formIdentifier') formIdentifier: string) {
    return this.formDefinitionService.getStats(formIdentifier);
  }

  // ============================================
  // 1.10 发布表单定义
  // ============================================

  @Post(':formIdentifier/publish')
  @Auditable()
  @Sensitive()
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:admin')
  // @ApiOperation({ summary: '发布表单定义' })
  async publish(
    @Param('formIdentifier') formIdentifier: string,
    @Body() dto?: PublishFormDefinitionDto
  ) {
    return this.formDefinitionService.publish(formIdentifier, dto);
  }

  // ============================================
  // 1.11 复制表单定义
  // ============================================

  @Post(':formIdentifier/duplicate')
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:create')
  // @ApiOperation({ summary: '复制表单定义' })
  async duplicate(
    @Param('formIdentifier') formIdentifier: string,
    @Body() dto: CopyFormDefinitionDto,
    @CurrentUser('userId') userId: string
  ) {
    return this.formDefinitionService.copy(formIdentifier, dto, userId);
  }

  // ============================================
  // 1.12 获取表单的所有分类
  // ============================================

  @Get('_meta/categories')
  @RequirePermissions('form:read')
  // @ApiOperation({ summary: '获取表单的所有分类' })
  async getCategories() {
    // 这是一个聚合查询，返回所有不同的分类
    // 由于 Prisma 不直接支持 distinct on JSON，这里简化实现
    return {
      categories: [
        'finance',
        'hr',
        'admin',
        'it',
        'procurement',
        'other',
      ],
    };
  }

  // ============================================
  // 1.13 批量删除表单定义
  // ============================================

  @Delete('_batch/delete')
  @Auditable()
  @Sensitive()
  @RequirePermissions('form:delete')
  // @ApiOperation({ summary: '批量删除表单定义' })
  async batchDelete(@Body('ids') ids: string[]) {
    const results = {
      deleted: 0,
      failed: 0,
      errors: [] as Array<{ id: string; error: string }>,
    };

    for (const id of ids) {
      try {
        await this.formDefinitionService.remove(id);
        results.deleted++;
      } catch (error) {
        results.failed++;
        results.errors.push({ id, error: error.message });
      }
    }

    return results;
  }

  // ============================================
  // 1.14 批量归档表单定义
  // ============================================

  @Post('_batch/archive')
  @Auditable()
  @Sensitive()
  @HttpCode(HttpStatus.OK)
  @RequirePermissions('form:update')
  // @ApiOperation({ summary: '批量归档表单定义' })
  async batchArchive(@Body('ids') ids: string[]) {
    const results = {
      archived: 0,
      failed: 0,
      errors: [] as Array<{ id: string; error: string }>,
    };

    for (const id of ids) {
      try {
        await this.formDefinitionService.archive(id);
        results.archived++;
      } catch (error) {
        results.failed++;
        results.errors.push({ id, error: error.message });
      }
    }

    return results;
  }
}

