import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { JobEntity } from './entities/job.entity';

@Injectable()
export class JobRepository {
  constructor(
    @InjectRepository(JobEntity)
    private readonly jobRepository: Repository<JobEntity>,
  ) {}

  async findAll(take: number, skip: number, search: string) {
    const query = this.jobRepository
      .createQueryBuilder('job')
      .leftJoinAndSelect('job.users', 'user')
      .orderBy('job.name', 'ASC')
      .skip(skip)
      .take(take);

    if (search) {
      query.where('job.name ILIKE :search', { search: `%${search}%` });
    }

    const [data, count] = await query.getManyAndCount();

    const result = data.map((job) => ({
      ...job,
      user_count: job.users.filter((user) => user.status === 1).length,
    }));

    const response = {
      count,
      result: result.map(({ users, ...rest }) => ({
        ...rest,
        user_count: rest.user_count,
      })),
    };

    return response;
  }

  async findOne(id: string) {
    return this.jobRepository.findOne({ where: { id } });
  }

  async findJob(name: string, id?: string) {
    const normalizedName = name.toLowerCase();

    const query = this.jobRepository
      .createQueryBuilder('job')
      .where('LOWER(job.name) = :name', { name: normalizedName });

    if (id) {
      query.andWhere('job.id != :id', { id });
    }

    return query.getOne();
  }
}
