import {
  Controller,
  Get,
  Post,
  Put,
  Delete,
  Body,
  Param,
  Query,
  UseGuards,
  Request,
  HttpCode,
  HttpStatus,
} from '@nestjs/common';
import { UsersService } from './users.service';
import { AuthGuard } from '../auth/auth.guard';
import { UpdatePushTokenDto, BlockUserDto, ReportContentDto } from './users.dto';

@Controller('users')
@UseGuards(AuthGuard)
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Put('push-token')
  @HttpCode(HttpStatus.OK)
  updatePushToken(@Request() req, @Body() payload: UpdatePushTokenDto) {
    return this.usersService.updatePushToken(req.user.id, payload.token);
  }

  @Get('blocked')
  @HttpCode(HttpStatus.OK)
  getBlockedUsers(@Request() req) {
    return this.usersService.getBlockedUsers(req.user.id);
  }

  @Post('block')
  @HttpCode(HttpStatus.OK)
  blockUser(@Request() req, @Body() payload: BlockUserDto) {
    return this.usersService.blockUser(req.user.id, payload.blockedUserId);
  }

  @Delete(':id/block')
  @HttpCode(HttpStatus.OK)
  unblockUser(@Request() req, @Param('id') blockedUserId: string) {
    return this.usersService.unblockUser(req.user.id, blockedUserId);
  }

  @Post('content-report')
  @HttpCode(HttpStatus.CREATED)
  reportContent(@Request() req, @Body() payload: ReportContentDto) {
    return this.usersService.reportContent(req.user.id, payload);
  }

  @Delete('account')
  @HttpCode(HttpStatus.OK)
  deleteAccount(@Request() req) {
    return this.usersService.deleteAccount(req.user.id);
  }

  @Get('credits')
  @HttpCode(HttpStatus.OK)
  getCredits(@Request() req) {
    return this.usersService.getUserCreditBalance(req.user.id);
  }

  @Get('credit-activity')
  @HttpCode(HttpStatus.OK)
  getCreditActivity(@Request() req, @Query('page') page?: string, @Query('limit') limit?: string) {
    return this.usersService.getCreditActivity(req.user.id, Number(page) || 0, Number(limit) || 50);
  }

  @Get('referral')
  @HttpCode(HttpStatus.OK)
  getReferralStats(@Request() req) {
    return this.usersService.getReferralStats(req.user.id);
  }

}
