/**
 * 日志管理 Controller
 * 提供日志查询、配置管理、统计分析、告警管理等 API
 */

import {
  Controller,
  Get,
  Put,
  Post,
  Body,
  Query,
  Param,
  UseGuards,
  Request,
} from '@nestjs/common';
import { LogManagementService } from './services/log-management.service';
import {
  QueryLogDto,
  QueryErrorLogDto,
  QuerySlowRequestDto,
  QueryLogStatsDto,
  QueryAlertHistoryDto,
  UpdateLogConfigDto,
  CleanupLogDto,
  UpdateAlertConfigDto,
  TestAlertDto,
} from './dto';
import { PermissionsGuard } from '@modules/organization/auth/guards/permissions.guard';
import { RequirePermissions } from '@common/decorators/permissions.decorator';

@Controller('logs')
export class LogsController {
  constructor(private readonly logManagementService: LogManagementService) {}

  // ==================== 日志查询 ====================

  /**
   * 查询日志列表
   * GET /api/v1/logs/query
   */
  @Get('query')
  @RequirePermissions('log:read')
  async queryLogs(@Query() query: QueryLogDto) {
    return this.logManagementService.queryLogs(query);
  }

  /**
   * 按追踪 ID 查询完整链路
   * GET /api/v1/logs/trace/:traceId
   */
  @Get('trace/:traceId')
  @RequirePermissions('log:read')
  async getTrace(@Param('traceId') traceId: string) {
    return this.logManagementService.getTrace(traceId);
  }

  /**
   * 查询错误日志
   * GET /api/v1/logs/errors
   */
  @Get('errors')
  @RequirePermissions('log:read')
  async queryErrorLogs(@Query() query: QueryErrorLogDto) {
    return this.logManagementService.queryErrorLogs(query);
  }

  /**
   * 查询慢请求
   * GET /api/v1/logs/slow-requests
   */
  @Get('slow-requests')
  @RequirePermissions('log:read')
  async querySlowRequests(@Query() query: QuerySlowRequestDto) {
    return this.logManagementService.querySlowRequests(query);
  }

  // ==================== 配置管理 ====================

  /**
   * 获取日志配置
   * GET /api/v1/logs/config
   */
  @Get('config')
  @RequirePermissions('log:config')
  async getConfig() {
    return this.logManagementService.getConfig();
  }

  /**
   * 更新日志配置
   * PUT /api/v1/logs/config
   */
  @Put('config')
  @RequirePermissions('log:config')
  async updateConfig(@Body() dto: UpdateLogConfigDto, @Request() req: any) {
    return this.logManagementService.updateConfig(dto, req.user.userId);
  }

  /**
   * 手动清理日志
   * POST /api/v1/logs/cleanup
   */
  @Post('cleanup')
  @RequirePermissions('log:cleanup')
  async cleanupLogs(@Body() dto: CleanupLogDto) {
    return this.logManagementService.cleanupLogs(dto);
  }

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

  /**
   * 获取日志统计
   * GET /api/v1/logs/stats
   */
  @Get('stats')
  @RequirePermissions('log:read')
  async getStats(@Query() query: QueryLogStatsDto) {
    return this.logManagementService.getStats(query);
  }

  // ==================== 告警管理 ====================

  /**
   * 获取告警历史
   * GET /api/v1/logs/alerts
   */
  @Get('alerts')
  @RequirePermissions('log:alert')
  async getAlertHistory(@Query() query: QueryAlertHistoryDto) {
    return this.logManagementService.getAlertHistory(query);
  }

  /**
   * 获取告警配置
   * GET /api/v1/logs/alerts/config
   */
  @Get('alerts/config')
  @RequirePermissions('log:alert')
  async getAlertConfig() {
    return this.logManagementService.getAlertConfig();
  }

  /**
   * 更新告警配置
   * PUT /api/v1/logs/alerts/config
   */
  @Put('alerts/config')
  @RequirePermissions('log:alert')
  async updateAlertConfig(@Body() dto: UpdateAlertConfigDto, @Request() req: any) {
    return this.logManagementService.updateAlertConfig(dto, req.user.userId);
  }

  /**
   * 测试告警通道
   * POST /api/v1/logs/alerts/test
   */
  @Post('alerts/test')
  @RequirePermissions('log:alert')
  async testAlert(@Body() dto: TestAlertDto) {
    return this.logManagementService.testAlert(dto);
  }
}

