import { Controller, Get, Param, Query, UseGuards } from '@nestjs/common';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { Roles } from '../common/decorators/roles.decorator';
import { RolesGuard } from '../common/guards/roles.guard';
import { MANAGEMENT_ROLES } from '../common/constants/roles';
import { UsersService } from '../users/users.service';
import { AnalyticsService } from './analytics.service';

@ApiTags('analytics')
@ApiBearerAuth('access-token')
@Controller('analytics')
@UseGuards(RolesGuard)
@Roles(...MANAGEMENT_ROLES)
export class AnalyticsController {
  constructor(
    private readonly analytics: AnalyticsService,
    private readonly users: UsersService,
  ) {}

  @Get('user/:userId')
  async userReport(
    @Param('userId') userId: string,
    @Query('from') from?: string,
    @Query('to') to?: string,
  ) {
    const user =
      (await this.users.findByUid(userId)) ??
      (await this.users.findById(userId));
    if (!user) return { trips: [], summary: {} };
    return this.analytics.userReport(user._id.toString(), from, to);
  }

  @Get('daily')
  daily(
    @Query('from') from?: string,
    @Query('to') to?: string,
    @Query('userId') userId?: string,
  ) {
    return this.analytics.dailySummaries(from, to, userId);
  }

  @Get('monthly')
  monthly(@Query('year') year?: string, @Query('userId') userId?: string) {
    return this.analytics.monthlySummaries(
      year ? Number(year) : undefined,
      userId,
    );
  }
}
