import {
  Controller,
  Get,
  Post,
  Put,
  Body,
  Param,
  Query,
  UseGuards,
  Request,
  ParseUUIDPipe,
} from '@nestjs/common';
import { TicketService } from './ticket.service';
import {
  CreateAITicketDto,
  UpdateAITicketDto,
  AssignAITicketDto,
  ResolveAITicketDto,
  QueryAITicketDto,
} from '../dto';
import { PermissionsGuard } from '@modules/organization/auth/guards/permissions.guard';
import { RequirePermissions } from '@common/decorators/permissions.decorator';
import { Auditable, Sensitive } from '@core/observability/audit/decorators/auditable.decorator';

@Controller('ai-assistant/tickets')
export class TicketController {
  constructor(private readonly ticketService: TicketService) {}

  /**
   * 创建工单（升级问题）
   */
  @Post()
  @Auditable()

  @RequirePermissions('ai:ticket:create')
  async create(@Body() dto: CreateAITicketDto, @Request() req: any) {
    return this.ticketService.createTicket(dto, req.user.userId);
  }

  /**
   * 获取工单列表
   */
  @Get()

  @RequirePermissions('ai:ticket:read')
  async findAll(@Query() query: QueryAITicketDto, @Request() req: any) {
    const isAdmin = req.user.permissions?.includes('ai:ticket:admin') || false;
    return this.ticketService.findTickets(query, req.user.userId, isAdmin);
  }

  /**
   * 获取工单详情
   */
  @Get(':id')

  @RequirePermissions('ai:ticket:read')
  async findOne(
    @Param('id', ParseUUIDPipe) id: string,
    @Request() req: any,
  ) {
    const isAdmin = req.user.permissions?.includes('ai:ticket:admin') || false;
    return this.ticketService.findTicket(id, req.user.userId, isAdmin);
  }

  /**
   * 更新工单
   */
  @Put(':id')
  @Auditable()

  @RequirePermissions('ai:ticket:update')
  async update(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: UpdateAITicketDto,
    @Request() req: any,
  ) {
    const isAdmin = req.user.permissions?.includes('ai:ticket:admin') || false;
    return this.ticketService.updateTicket(id, dto, req.user.userId, isAdmin);
  }

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

  @RequirePermissions('ai:ticket:update')
  async assign(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: AssignAITicketDto,
    @Request() req: any,
  ) {
    const isAdmin = req.user.permissions?.includes('ai:ticket:admin') || false;
    return this.ticketService.assignTicket(id, dto, req.user.userId, isAdmin);
  }

  /**
   * 解决工单
   */
  @Post(':id/resolve')
  @Auditable()

  @RequirePermissions('ai:ticket:update')
  async resolve(
    @Param('id', ParseUUIDPipe) id: string,
    @Body() dto: ResolveAITicketDto,
    @Request() req: any,
  ) {
    const isAdmin = req.user.permissions?.includes('ai:ticket:admin') || false;
    return this.ticketService.resolveTicket(id, dto, req.user.userId, isAdmin);
  }
}
