// group.controller.ts
import { Body, Controller, Delete, Get, Param, Patch, Post, Req, UseGuards } from "@nestjs/common";
import { UpdateGroupDto } from "./dto/update-group.dto";
import { CreateGroupDto } from "./dto/create-group.dto";
import { GroupService } from "./group.service";
import { AddMemberDto } from './dto/add-member.dto';
import { GroupAdmin } from "@/auth/decorator/resource.decorator";
import { RequireMember } from "@/auth/decorator/permission.decorator";
import { JwtAuthGuard } from "@/auth/guards/jwt-auth/jwt-auth.guard";

@UseGuards(JwtAuthGuard)
@Controller('groups')
export class GroupController {
  constructor(private readonly groupService: GroupService) {}

  // =============================
  // CREATE
  // =============================
  @Post()
  create(@Req() req, @Body() dto: CreateGroupDto) {
    return this.groupService.create(req.user.id, dto);
  }

  // =============================
  // UPDATE
  // =============================
  @Patch(':id')
  @GroupAdmin()
  update(
    @Param('id') id: string,
    @Req() req,
    @Body() dto: UpdateGroupDto,
  ) {
    return this.groupService.update(id, req.user.id, dto);
  }

  // =============================
  // DELETE
  // =============================
  @Delete(':id')
  @GroupAdmin()
  delete(@Param('id') id: string, @Req() req) {
    return this.groupService.delete(id, req.user.id);
  }

  // =============================
  // GET DETAIL
  // =============================
  @Get(':id')
  @RequireMember()
  findOne(@Param('id') id: string, @Req() req) {
    return this.groupService.findById(id, req);
  }

  // =============================
  // MEMBERS
  // =============================
  @Post(':id/members')
  @GroupAdmin()
  addMember(@Param('id') id: string, @Req() req, @Body() dto: AddMemberDto) {
    return this.groupService.addMember(id, req.user.id, dto);
  }

  // =============================
  // MEMBERS - Remove member
  // =============================
  @Delete(':id/members/:userId')
  @GroupAdmin()
  removeMember(@Param('id') id: string, @Param('userId') userId: string, @Req() req) {
    return this.groupService.removeMember(id, req.user.id, userId);
  }

  // =============================
  // MY GROUPS
  // =============================
  @Get()
  findMyGroups(@Req() req) {
    return this.groupService.findMyGroups(req.user.id);
  }

  // =============================
  // GET MEMBERS WITH DELETED
  // =============================
  @Get(':id/members/with-deleted-paid')
  @RequireMember()
  async getMembersWithDeletedButPaid(
    @Param('id') id: string,
  ) {
    return await this.groupService.getGroupMembersWithDeletedButPaidAndParticipant(
      id,
    );
  }
}