import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  UseGuards,
  Req,
  Res,
  Query,
  UseInterceptors,
} from "@nestjs/common";
import { TrainingCalloutService } from "./training-callout.service";
import { UserDecorator } from "src/common/decorator/user.decorator";
import { CreateTrainingCalloutDto } from "./dto/create-training-callout.dto";
import { UpdateTrainingCalloutDto } from "./dto/update-training-callout.dto";
import { RoleEnum } from "src/common/enums/constant.enum";
import { Roles } from "src/common/decorator/roles.decorator";
import { UserAuthGuard } from "src/common/guards/jwt-auth.guard";
import { RolesGuard } from "src/common/guards/roles.guard";
import { Request, Response } from "express";
import { User } from "src/user/schemas/user.schema";
import { ImportExport } from "aws-sdk";
import { GetTrainingCalloutDto } from "./dto/get-training-callout.dto";
import { LanguageInterceptor } from "src/common/interceptor/language.interceptor";

@Controller("training-callout")
export class TrainingCalloutController {
  constructor(
    private readonly trainingCalloutService: TrainingCalloutService,
  ) {}

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

  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Patch(":id")
  updateTrainingCallout(
    @Param("id") id: string,
    @UserDecorator() user: any,
    @Body() body: UpdateTrainingCalloutDto,
    @Req() req: Request,
    @Res() res: Response,
  ) {
    return this.trainingCalloutService.updateTrainingCallout(
      user._id,
      id,
      body,
      req,
      res,
    );
  }

  @UseGuards(UserAuthGuard, RolesGuard)
  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Delete(":id")
  deleteTrainingCallout(
    @Param("id") id: string,
    @UserDecorator() user: any,
    @Req() req: Request,
    @Res() res: Response,
  ) {
    return this.trainingCalloutService.deleteTrainingCallout(
      user._id,
      id,
      req,
      res,
    );
  }

  // @UseGuards(UserAuthGuard, RolesGuard)
  // @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  // @Get("list")
  // @UseInterceptors(LanguageInterceptor)
  // getTrainingCallouts(
  //   @UserDecorator() user: any,
  //   @Body() body: SearchTrainingCalloutDto,
  //   @Req() req: Request,
  //   @Res() res: Response,
  //   @Query("page") page = 1,
  //   @Query("limit") limit = 20,
  // ) {
  //   let lang = (req as any)?.lang;
  //   return this.trainingCalloutService.getTrainingCallouts(
  //     user._id,
  //     body,
  //     req,
  //     res,
  //     lang,
  //     Number(page),
  //     Number(limit),
  //   );
  // }

  @UseGuards(UserAuthGuard, RolesGuard)
  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Post("join/:calloutId")
  joinTrainingCallout(
    @UserDecorator() user: any,
    @Param("calloutId") calloutId: string,
    @Req() req: Request,
    @Res() res: Response,
  ) {
    return this.trainingCalloutService.joinTrainingCallout(
      user._id,
      calloutId,
      req,
      res,
    );
  }

  @UseGuards(UserAuthGuard, RolesGuard)
  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Get("my-joined")
  getMyJoinedTrainingCallouts(
    @UserDecorator() user: any,
    @Query("page") page: number,
    @Query("limit") limit: number,
    @Req() req: Request,
    @Res() res: Response,
  ) {
    return this.trainingCalloutService.getMyJoinedTrainingCallouts(
      user._id,
      page,
      limit,
      req,
      res,
    );
  }

  @UseGuards(UserAuthGuard, RolesGuard)
  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Post("list")
  @UseInterceptors(LanguageInterceptor)
  async getTrainingCallouts(
    @Body() body: GetTrainingCalloutDto,
    @Req() req: Request,
    @Res() res: Response,
    @UserDecorator() user: any,
  ) {
    let lang = (req as any)?.lang;
    return this.trainingCalloutService.getTrainingCallouts(
      user._id,
      body,
      req,
      res,
      lang,
    );
  }

  @UseGuards(UserAuthGuard, RolesGuard)
  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Post("quit/:calloutId")
  quitTrainingCallout(
    @UserDecorator() user: any,
    @Param("calloutId") calloutId: string,
    @Req() req: Request,
    @Res() res: Response,
  ) {
    return this.trainingCalloutService.quitTrainingCallout(
      user._id,
      calloutId,
      req,
      res,
    );
  }

  @UseGuards(UserAuthGuard, RolesGuard)
  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Get("buddy-suggestions")
   @UseInterceptors(LanguageInterceptor)
  getBuddySuggestionsFromCallouts(
    @UserDecorator() user: any,
    @Req() req: Request,
    @Res() res: Response,
  ) {
     let lang = (req as any)?.lang;
    return this.trainingCalloutService.getBuddySuggestionsFromCallouts(
      user._id,
      req,
      res,
      lang
    );
  }

  @UseGuards(UserAuthGuard, RolesGuard)
  @Roles(RoleEnum.ADMIN, RoleEnum.USER)
  @Get("my-joined-callout")
  getMyJoinedCallout(
    @UserDecorator() user: any,
    @Query("page") page: number,
    @Query("limit") limit: number,
    @Req() req: Request,
    @Res() res: Response,
  ) {
    return this.trainingCalloutService.getMyJoinedCallout(
      user._id,
      page,
      limit,
      req,
      res,
    );
  }
}
