import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  Query,
  UseGuards,
  Request,
  ParseUUIDPipe,
} from '@nestjs/common';
import { TicketsService } from './tickets.service';
import {
  CreateTicketDto,
  UpdateTicketDto,
  UpdateTicketStatusDto,
  AssignTicketDto,
  QueryTicketDto,
  CreateCommentDto,
  QueryCommentDto,
  CreateSatisfactionDto,
  QueryActivityDto,
} from './dto';
import { PermissionsGuard } from '@modules/organization/auth/guards/permissions.guard';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { GroupService } from './services/group.service';
import { Auditable, Sensitive, Financial } from '@core/observability/audit/decorators/auditable.decorator';

@Controller('tickets')
export class TicketsController {
  constructor(
    private readonly ticketsService: TicketsService,
    private readonly groupService: GroupService,
  ) {}

  // ==================== 工单管理 ====================

  /**
   * 创建工单
   */
  @Post()
  @Auditable()
  @Sensitive()

  @RequirePermissions('ticket:create')
  async create(@Body() createTicketDto: CreateTicketDto, @Request() req: any) {
    const { userId, region, tenantId } = req.user;
    return this.ticketsService.create(createTicketDto, userId, region, tenantId);
  }

  /**
   * 获取工单列表
   */
  @Get()
  async findAll(@Query() query: QueryTicketDto, @Request() req: any) {
    const { userId, isAdmin } = req.user;
    
    // 获取用户所属的处理组
    const userGroups = await this.groupService.getGroupsByUserId(userId);
    const userGroupIds = userGroups.map((g) => g.id);

    return this.ticketsService.findAll(query, userId, userGroupIds, isAdmin);
  }

  /**
   * 获取工单详情
   */
  @Get(':id')
  async findOne(@Param('id', ParseUUIDPipe) id: string, @Request() req: any) {
    const { userId, isAdmin } = req.user;
    
    const userGroups = await this.groupService.getGroupsByUserId(userId);
    const userGroupIds = userGroups.map((g) => g.id);

    return this.ticketsService.findOne(id, userId, userGroupIds, isAdmin);
  }

  /**
   * 更新工单
   */
  @Patch(':id')
  @Auditable()
  async update(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() updateTicketDto: UpdateTicketDto,
    @Request() req: any,
  ) {
    return this.ticketsService.update(id, updateTicketDto, req.user.userId);
  }

  /**
   * 更新工单状态
   */
  @Patch(':id/status')
  @Auditable()
  async updateStatus(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() updateStatusDto: UpdateTicketStatusDto,
    @Request() req: any,
  ) {
    return this.ticketsService.updateStatus(id, updateStatusDto, req.user.userId);
  }

  /**
   * 分配工单
   */
  @Post(':id/assign')
  @Auditable()
  @Sensitive()

  @RequirePermissions('ticket:assign')
  async assign(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() assignDto: AssignTicketDto,
    @Request() req: any,
  ) {
    return this.ticketsService.assign(id, assignDto, req.user.userId);
  }

  /**
   * 删除工单（软删除）
   */
  @Delete(':id')
  @Auditable()
  @Sensitive()

  @RequirePermissions('ticket:delete')
  async remove(@Param('id', ParseUUIDPipe) id: string, @Request() req: any) {
    return this.ticketsService.remove(id, req.user.userId);
  }

  // ==================== 评论管理 ====================

  /**
   * 获取工单评论列表
   */
  @Get(':id/comments')
  async getComments(
    @Param('id', ParseUUIDPipe) id: string,
    @Query() query: QueryCommentDto,
    @Request() req: any,
  ) {
    const { userId } = req.user;
    // TODO: 判断用户是否是处理人
    const isAgent = true;
    return this.ticketsService.getComments(id, query, userId, isAgent);
  }

  /**
   * 添加评论
   */
  @Post(':id/comments')
  @Auditable()
  async addComment(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() createCommentDto: CreateCommentDto,
    @Request() req: any,
  ) {
    return this.ticketsService.addComment(id, createCommentDto, req.user.userId);
  }

  /**
   * 删除评论
   */
  @Delete(':id/comments/:commentId')
  @Auditable()
  @Sensitive()
  async deleteComment(
    @Param('id', ParseUUIDPipe) id: string,
    @Param('commentId', ParseUUIDPipe) commentId: string,
    @Request() req: any,
  ) {
    return this.ticketsService.deleteComment(id, commentId, req.user.userId);
  }

  // ==================== 满意度评价 ====================

  /**
   * 提交满意度评价
   */
  @Post(':id/satisfaction')
  @Auditable()
  async submitSatisfaction(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() satisfactionDto: CreateSatisfactionDto,
    @Request() req: any,
  ) {
    return this.ticketsService.submitSatisfaction(
      id,
      satisfactionDto,
      req.user.userId,
    );
  }

  // ==================== 关注者管理 ====================

  /**
   * 关注工单
   */
  @Post(':id/watch')
  @Auditable()
  @Sensitive()
  async watch(@Param('id', ParseUUIDPipe) id: string, @Request() req: any) {
    return this.ticketsService.addWatcher(id, req.user.userId, req.user.userId);
  }

  /**
   * 取消关注
   */
  @Delete(':id/watch')
  @Auditable()
  @Sensitive()
  async unwatch(@Param('id', ParseUUIDPipe) id: string, @Request() req: any) {
    return this.ticketsService.removeWatcher(id, req.user.userId, req.user.userId);
  }

  /**
   * 添加关注者
   */
  @Post(':id/watchers/:watcherId')
  @Auditable()
  async addWatcher(
    @Param('id', ParseUUIDPipe) id: string,
    @Param('watcherId', ParseUUIDPipe) watcherId: string,
    @Request() req: any,
  ) {
    return this.ticketsService.addWatcher(id, watcherId, req.user.userId);
  }

  /**
   * 移除关注者
   */
  @Delete(':id/watchers/:watcherId')
  @Auditable()
  @Sensitive()
  async removeWatcher(
    @Param('id', ParseUUIDPipe) id: string,
    @Param('watcherId', ParseUUIDPipe) watcherId: string,
    @Request() req: any,
  ) {
    return this.ticketsService.removeWatcher(id, watcherId, req.user.userId);
  }

  // ==================== 活动日志 ====================

  /**
   * 获取活动日志
   */
  @Get(':id/activities')
  async getActivities(
    @Param('id', ParseUUIDPipe) id: string,
    @Query() query: QueryActivityDto,
  ) {
    return this.ticketsService.getActivities(id, query);
  }
}
