import { GroupMember } from '@/entities/group-member.entity';
import { Trip } from '@/entities/trip.entity';
import {
  Injectable,
  CanActivate,
  ExecutionContext,
  ForbiddenException,
  NotFoundException,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

@Injectable()
export class TripOwnerGuard implements CanActivate {
  constructor(
    @InjectRepository(Trip)
    private tripRepo: Repository<Trip>,

    @InjectRepository(GroupMember)
    private groupMemberRepo: Repository<GroupMember>,
  ) {}

  async canActivate(context: ExecutionContext): Promise<boolean> {
    const request = context.switchToHttp().getRequest();

    const user = request.user;
    const tripId = request.params.tripId || request.params.id;

    if (!tripId) {
      throw new NotFoundException('Trip không tồn tại');
    }

    // 1. Lấy trip
    const trip = await this.tripRepo
      .createQueryBuilder('trip')
      .leftJoinAndSelect('trip.group', 'group')
      .leftJoinAndSelect('group.members', 'member')
      .leftJoinAndSelect('member.user', 'user')
      .where('trip.id = :tripId', {tripId})
      .getOne();

    if (!trip) {
      throw new NotFoundException('Trip không tồn tại');
    }

    // 2. Check member + role
    const member = await this.groupMemberRepo.findOne({
      where: {
        group: { id: trip.group.id },
        user: { id: user.id },
      },
    });

    if (!member) {
      throw new ForbiddenException('Bạn không thuộc group này');
    }

    if (member.role !== 'owner') {
      throw new ForbiddenException('Chỉ trưởng nhóm (owner) mới có quyền');
    }

    // optional
    request.trip = trip;
    request.groupMember = member;

    return true;
  }
}