import { Controller, Get, Query, UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { PermissionsGuard } from '../auth/guards/permissions.guard';
import { Permissions } from '../auth/permissions.decorator';
import { AnalyticsService } from './analytics.service';

@Controller('api/v1/admin/analytics')
@UseGuards(JwtAuthGuard, PermissionsGuard)
export class AnalyticsController {
  constructor(private readonly service: AnalyticsService) {}

  /** Everything the dashboard's stat tiles need, in one round trip. */
  @Get('dashboard')
  @Permissions('dashboard.view')
  async dashboard() {
    const [summary, topModules, activityUsage, trend] = await Promise.all([
      this.service.summary(),
      this.service.topModules(5),
      this.service.activityUsage(),
      this.service.engagementTrend(30),
    ]);
    return {
      success: true,
      message: 'Success',
      data: { summary, topModules, activityUsage, trend },
    };
  }

  @Get('summary')
  @Permissions('analytics.view')
  async summary() {
    const data = await this.service.summary();
    return { success: true, message: 'Success', data };
  }

  @Get('top-modules')
  @Permissions('analytics.view')
  async topModules(@Query('limit') limit?: string) {
    const data = await this.service.topModules(limit ? Number(limit) : 10);
    return { success: true, message: 'Success', data };
  }

  @Get('activity-usage')
  @Permissions('analytics.view')
  async activityUsage() {
    const data = await this.service.activityUsage();
    return { success: true, message: 'Success', data };
  }

  @Get('drawing-usage')
  @Permissions('analytics.view')
  async drawingUsage(@Query('limit') limit?: string) {
    const data = await this.service.drawingUsage(limit ? Number(limit) : 10);
    return { success: true, message: 'Success', data };
  }

  @Get('section-completion')
  @Permissions('analytics.view')
  async sectionCompletion() {
    const data = await this.service.sectionCompletion();
    return { success: true, message: 'Success', data };
  }

  @Get('trend')
  @Permissions('analytics.view')
  async trend(@Query('days') days?: string) {
    const data = await this.service.engagementTrend(days ? Number(days) : 30);
    return { success: true, message: 'Success', data };
  }
}
