import { BadRequestException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { EntityManager, FindOptionsWhere, Repository } from 'typeorm';
import { Tickets } from './entity/tickets.entity';
import { AppUser } from './entity/user.entity';

@Injectable()
export class TicketsService {
  constructor(
    @InjectRepository(Tickets) private ticketsRepository: Repository<Tickets>,
    private entityManage: EntityManager,
  ) {}

  save(data: Partial<Tickets>) {
    return this.ticketsRepository.save(new Tickets(data));
  }

  findOne(data: FindOptionsWhere<Tickets>[] | FindOptionsWhere<Tickets>) {
    return this.ticketsRepository.findOne({
      where: data,
    });
  }

  update(id: number, data: Partial<Tickets>) {
    return this.ticketsRepository.update(id, new Tickets(data));
  }

  recharge(uid: number, password: string) {
    return this.entityManage.transaction(async (manager) => {
      const ticket = await manager.findOne(Tickets, { where: { password } });
      if (!ticket) {
        throw new BadRequestException('卡密不存在，请确认后再兑换');
      }
      if (ticket.isOff == 1) {
        throw new BadRequestException('卡密已被兑换,请确认');
      }
      const user = await manager.findOne(AppUser, { where: { id: uid } });
      if (!user) {
        throw new BadRequestException('用户不存在');
      }
      await manager.update(
        AppUser,
        uid,
        new AppUser({
          wallet: user.wallet + ticket.amount,
        }),
      );
      await manager.update(Tickets, ticket.id, new Tickets({ isOff: 1 }));
    });
  }
}
