import { Controller, Delete, Get, Param, Post, Query, UseGuards } from '@nestjs/common';
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
import { CurrentUser } from '../../common/decorators/current-user.decorator';
import { PaginationQueryDto } from '../../common/dto/pagination-query.dto';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { JwtPayload } from '../../common/interfaces/jwt-payload.interface';
import { FollowsService } from './follows.service';

@ApiTags('Users')
@ApiBearerAuth()
@UseGuards(JwtAuthGuard)
@Controller('users')
export class FollowsUsersController {
  constructor(private readonly followsService: FollowsService) {}

  @Get('me/followers')
  async myFollowers(@CurrentUser() user: JwtPayload, @Query() query: PaginationQueryDto) {
    return this.followsService.getFollowers(user.sub, query, user.sub);
  }

  @Get('me/following')
  async myFollowing(@CurrentUser() user: JwtPayload, @Query() query: PaginationQueryDto) {
    return this.followsService.getFollowing(user.sub, query, user.sub);
  }

  @Post(':userId/follow')
  async followUser(@CurrentUser() user: JwtPayload, @Param('userId') targetUserId: string) {
    return this.followsService.followUser(user.sub, targetUserId);
  }

  @Delete(':userId/follow')
  async unfollowUser(@CurrentUser() user: JwtPayload, @Param('userId') targetUserId: string) {
    return this.followsService.unfollowUser(user.sub, targetUserId);
  }

  @Delete(':followerId/followers')
  async removeFollower(@CurrentUser() user: JwtPayload, @Param('followerId') followerId: string) {
    return this.followsService.removeFollower(user.sub, followerId);
  }

  @Get(':userId/follow-status')
  async followStatus(@CurrentUser() user: JwtPayload, @Param('userId') targetUserId: string) {
    return this.followsService.getFollowStatus(user.sub, targetUserId);
  }

  @Get(':userId/followers')
  async followers(
    @CurrentUser() user: JwtPayload,
    @Param('userId') targetUserId: string,
    @Query() query: PaginationQueryDto,
  ) {
    return this.followsService.getFollowers(targetUserId, query, user.sub);
  }

  @Get(':userId/following')
  async following(
    @CurrentUser() user: JwtPayload,
    @Param('userId') targetUserId: string,
    @Query() query: PaginationQueryDto,
  ) {
    return this.followsService.getFollowing(targetUserId, query, user.sub);
  }
}
