// guards/group-owner.guard.ts
import {
  Injectable,
  CanActivate,
  ExecutionContext,
  ForbiddenException,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { GroupMember } from '@/entities/group-member.entity';
import { Trip } from '@/entities/trip.entity';
import { Map } from '@/entities/map.entity';
import { BaseGroupGuard, PermissionLevel } from './base-group.guard';
import { Timeline } from '@/entities/timeline.entity';

@Injectable()
export class GroupOwnerOrAdminGuard extends BaseGroupGuard implements CanActivate {
  constructor(
    @InjectRepository(GroupMember)
    protected groupMemberRepo: Repository<GroupMember>,
    @InjectRepository(Trip)
    protected tripRepo: Repository<Trip>,
    @InjectRepository(Map)
    protected mapRepo: Repository<Map>,
    @InjectRepository(Timeline)
    protected timelineRepo: Repository<Timeline>,
  ) {
    super(groupMemberRepo, tripRepo, mapRepo, timelineRepo);
  }

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const req = context.switchToHttp().getRequest();
    const user = req.user;

    if (!user) return false;

    const groupId = await this.getGroupIdFromRequest(req);

    if (!groupId) {
      throw new ForbiddenException('Không xác định được nhóm');
    }

    return this.checkMemberPermission(req, user.id, groupId, PermissionLevel.ADMIN);
  }
}
