import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { ApiResultListWithTotal } from 'src/common/types/api-result';
import { UserDTO } from '../dto/user-dto';
import { encodeBigNumberKey } from '../utils/big-number-key';
import { InvitationEntity } from '../entities/invitation.entity';
import { InvitationInfo } from './dto/invitation-dto';

@Injectable()
export class CreatorsService {
  constructor(
    @InjectRepository(InvitationEntity)
    private readonly invitationRepo: Repository<InvitationEntity>,
  ) {}

  async getInvitations(
    account: UserDTO,
  ): Promise<ApiResultListWithTotal<InvitationInfo>> {
    const dbquery = this.invitationRepo
      .createQueryBuilder('i')
      .leftJoin(`projects`, 'p', 'i.project_id = p.id')
      .where('i.guest_email = :email', {
        email: account.email,
      })
      .select([
        'i.id as id',
        'i.code as code',
        'i.project_id as project_id',
        'p.title as project_title',
        'i.guest_email as email',
      ]);

    const total = await dbquery.getCount();
    const invitations = await dbquery.getRawMany();
    const list: InvitationInfo[] = invitations.map((invitation) => {
      return {
        projectId: encodeBigNumberKey(invitation.project_id),
        email: invitation.email,
        code: invitation.code,
        projectTitle: invitation.project_title,
      };
    });

    return {
      list,
      total,
    };
  }
}
