import {
  BadRequestException,
  Body,
  Controller,
  Delete,
  Get,
  Patch,
  Post,
  Query,
  Request,
  UseGuards,
} from '@nestjs/common';
import { QuoteService } from './quote.service';
import { CreateQuoteDto } from './dto/create-quote.dto';
import { UpdateQuoteDto } from './dto/update-quote.dto';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { Types } from 'mongoose';
import { Roles } from '../users/roles/roles.decorator';
import { Role } from '../users/roles/role.enum';
import { RolesGuard } from '../users/roles/roles.guard';

@Controller({
  path: 'quote',
  version: '1',
})
export class QuoteController {
  constructor(private readonly quoteService: QuoteService) {}

  @UseGuards(JwtAuthGuard)
  @Post()
  create(@Request() req, @Body() createQuoteDto: CreateQuoteDto) {
    return this.quoteService.create(createQuoteDto, req.user);
  }

  //// test
  @Post('without-auth')
  createWithoutAuth(@Body() createQuoteDto: CreateQuoteDto) {
    return this.quoteService.createWithoutAuth(createQuoteDto);
  }
  ////

  @UseGuards(JwtAuthGuard)
  @Get('allQuotes')
  findAll(@Request() req) {
    return this.quoteService.findAll(req.user);
  }

  @UseGuards(JwtAuthGuard)
  @Get()
  findOne(@Query('quoteID') id: string) {
    if (!Types.ObjectId.isValid(id)) {
      throw new BadRequestException('quoteID is not a valid MongoId');
    }

    return this.quoteService.findOne(id);
  }

  @UseGuards(JwtAuthGuard)
  @Get('number')
  getNumber() {
    return this.quoteService.generateNumber();
  }

  @Roles(Role.Admin)
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Patch()
  update(
    @Request() req,
    @Query('quoteID') id: string,
    @Body() updateQuoteDto: UpdateQuoteDto,
  ) {
    if (!Types.ObjectId.isValid(id)) {
      throw new BadRequestException('quoteID is not a valid MongoId');
    }

    const siteUrl = 'https://' + req.get('host');

    return this.quoteService.update(id, updateQuoteDto, siteUrl);
  }

  @UseGuards(JwtAuthGuard)
  @Delete()
  remove(@Query('quoteID') id: string) {
    if (!Types.ObjectId.isValid(id)) {
      throw new BadRequestException('quoteID is not a valid MongoId');
    }

    return this.quoteService.remove(id);
  }
}
