import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  Query,
  UseGuards,
  ParseUUIDPipe,
} from '@nestjs/common';
import { PermissionsGuard } from '@modules/organization/auth/guards/permissions.guard';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { Auditable, Sensitive, Financial } from '@core/observability/audit/decorators/auditable.decorator';
import {
  CategoryService,
  GroupService,
  StatsService,
} from './services';
import {
  CreateCategoryDto,
  UpdateCategoryDto,
  QueryCategoryDto,
  CreateGroupDto,
  UpdateGroupDto,
  QueryGroupDto,
  UpdateGroupMembersDto,
} from './dto';

@Controller('tickets/admin')
export class TicketAdminController {
  constructor(
    private readonly categoryService: CategoryService,
    private readonly groupService: GroupService,
    private readonly statsService: StatsService,
  ) {}

  // ==================== 分类管理 ====================

  /**
   * 创建分类
   */
  @Post('categories')
  @Auditable()
  @Sensitive()
  @RequirePermissions('ticket:admin')
  async createCategory(@Body() createCategoryDto: CreateCategoryDto) {
    return this.categoryService.create(createCategoryDto);
  }

  /**
   * 获取分类列表
   */
  @Get('categories')
  @RequirePermissions('ticket:read')
  async getCategories(@Query() query: QueryCategoryDto) {
    return this.categoryService.findAll(query);
  }

  /**
   * 获取分类树
   */
  @Get('categories/tree')
  @RequirePermissions('ticket:read')
  async getCategoryTree(@Query('isActiveOnly') isActiveOnly: string) {
    return this.categoryService.getCategoryTree(isActiveOnly !== 'false');
  }

  /**
   * 获取分类详情
   */
  @Get('categories/:id')
  @RequirePermissions('ticket:read')
  async getCategory(@Param('id', ParseUUIDPipe) id: string) {
    return this.categoryService.findOne(id);
  }

  /**
   * 更新分类
   */
  @Patch('categories/:id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('ticket:admin')
  async updateCategory(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() updateCategoryDto: UpdateCategoryDto,
  ) {
    return this.categoryService.update(id, updateCategoryDto);
  }

  /**
   * 删除分类
   */
  @Delete('categories/:id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('ticket:admin')
  async deleteCategory(@Param('id', ParseUUIDPipe) id: string) {
    return this.categoryService.remove(id);
  }

  // ==================== 处理组管理 ====================

  /**
   * 创建处理组
   */
  @Post('groups')
  @Auditable()
  @Sensitive()
  @RequirePermissions('ticket:admin')
  async createGroup(@Body() createGroupDto: CreateGroupDto) {
    return this.groupService.create(createGroupDto);
  }

  /**
   * 获取处理组列表
   */
  @Get('groups')
  @RequirePermissions('ticket:read')
  async getGroups(@Query() query: QueryGroupDto) {
    return this.groupService.findAll(query);
  }

  /**
   * 获取处理组详情
   */
  @Get('groups/:id')
  @RequirePermissions('ticket:read')
  async getGroup(@Param('id', ParseUUIDPipe) id: string) {
    return this.groupService.findOne(id);
  }

  /**
   * 获取处理组成员
   */
  @Get('groups/:id/members')
  @RequirePermissions('ticket:read')
  async getGroupMembers(@Param('id', ParseUUIDPipe) id: string) {
    return this.groupService.getMembers(id);
  }

  /**
   * 更新处理组
   */
  @Patch('groups/:id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('ticket:admin')
  async updateGroup(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() updateGroupDto: UpdateGroupDto,
  ) {
    return this.groupService.update(id, updateGroupDto);
  }

  /**
   * 添加处理组成员
   */
  @Post('groups/:id/members')
  @Auditable()
  @Sensitive()
  @RequirePermissions('ticket:admin')
  async addGroupMembers(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: UpdateGroupMembersDto,
  ) {
    return this.groupService.addMembers(id, dto);
  }

  /**
   * 移除处理组成员
   */
  @Delete('groups/:id/members')
  @Auditable()
  @Sensitive()
  @RequirePermissions('ticket:admin')
  async removeGroupMembers(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: UpdateGroupMembersDto,
  ) {
    return this.groupService.removeMembers(id, dto);
  }

  /**
   * 删除处理组
   */
  @Delete('groups/:id')
  @Auditable()
  @Sensitive()
  @RequirePermissions('ticket:admin')
  async deleteGroup(@Param('id', ParseUUIDPipe) id: string) {
    return this.groupService.remove(id);
  }

  // ==================== 统计分析 ====================

  /**
   * 获取统计概览
   */
  @Get('stats/overview')
  @RequirePermissions('ticket:stats')
  async getStatsOverview(
    @Query('startDate') startDate?: string,
    @Query('endDate') endDate?: string,
    @Query('region') region?: string,
    @Query('tenantId') tenantId?: string,
  ) {
    return this.statsService.getOverview(
      startDate ? new Date(startDate) : undefined,
      endDate ? new Date(endDate) : undefined,
      region,
      tenantId,
    );
  }

  /**
   * 获取状态分布
   */
  @Get('stats/status-distribution')
  @RequirePermissions('ticket:stats')
  async getStatusDistribution(
    @Query('region') region?: string,
    @Query('tenantId') tenantId?: string,
  ) {
    return this.statsService.getStatusDistribution(region, tenantId);
  }

  /**
   * 获取分类分布
   */
  @Get('stats/category-distribution')
  @RequirePermissions('ticket:stats')
  async getCategoryDistribution(
    @Query('region') region?: string,
    @Query('tenantId') tenantId?: string,
  ) {
    return this.statsService.getCategoryDistribution(region, tenantId);
  }

  /**
   * 获取趋势数据
   */
  @Get('stats/trends')
  @RequirePermissions('ticket:stats')
  async getTrends(
    @Query('days') days?: string,
    @Query('region') region?: string,
    @Query('tenantId') tenantId?: string,
  ) {
    return this.statsService.getTrends(
      days ? parseInt(days, 10) : 30,
      region,
      tenantId,
    );
  }

  /**
   * 获取处理人工作量
   */
  @Get('stats/workload')
  @RequirePermissions('ticket:stats')
  async getAssigneeWorkload(
    @Query('assigneeIds') assigneeIds?: string,
    @Query('region') region?: string,
    @Query('tenantId') tenantId?: string,
  ) {
    return this.statsService.getAssigneeWorkload(
      assigneeIds ? assigneeIds.split(',') : undefined,
      region,
      tenantId,
    );
  }
}
