import {
  Body,
  Controller,
  Get,
  Post,
  Query,
  Req,
  Res,
  UseGuards,
} from "@nestjs/common";
import { Request, Response } from "express";
import { ApiBearerAuth, ApiTags } from "@nestjs/swagger";
import { WorkoutSessionService } from "./workout-session.service";
import { UserAuthGuard } from "src/common/guards/jwt-auth.guard";
import { RolesGuard } from "src/common/guards/roles.guard";
import { Roles } from "src/common/decorator/roles.decorator";
import { RoleEnum } from "src/common/enums/constant.enum";
import { UserDecorator } from "src/common/decorator/user.decorator";
import { CreateWorkoutSessionDto } from "./dto/create-workout-session.dto";

@ApiTags("Workout Session")
@ApiBearerAuth()
@Controller("workout-session")
export class WorkoutSessionController {
  constructor(
    private readonly workoutSessionService: WorkoutSessionService,
  ) {}

  @UseGuards(UserAuthGuard, RolesGuard)
  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Post()
  createWorkoutSession(
    @Body() body: CreateWorkoutSessionDto,
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
  ) {
    return this.workoutSessionService.createWorkoutSession(body, req, res, user);
  }

  // GET /workout-session/streak?month=1-12&year=YYYY
  // Weekly streak + a Monday→Sunday breakdown of every week in the given month.
  // month/year are optional and default to the current month/year.
  @UseGuards(UserAuthGuard, RolesGuard)
  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Get("streak")
  getWeeklyStreak(
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
    @Query("month") month?: string,
    @Query("year") year?: string,
  ) {
    return this.workoutSessionService.getWeeklyStreak(
      req,
      res,
      user,
      month,
      year,
    );
  }

  // GET /workout-session/training-frequency?view=weeks|calendar&weeks=6&month=8&year=2026
  // Weeks tab  → bar chart of sessions per week (last `weeks` weeks).
  // Calendar tab → month grid with trained days highlighted.
  // Both include lifetime "stats since start". All params are optional.
  @UseGuards(UserAuthGuard, RolesGuard)
  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Get("training-frequency")
  getTrainingFrequency(
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
    @Query("view") view?: string,
    @Query("weeks") weeks?: string,
    @Query("month") month?: string,
    @Query("year") year?: string,
  ) {
    return this.workoutSessionService.getTrainingFrequency(
      req,
      res,
      user,
      view,
      weeks,
      month,
      year,
    );
  }
}
