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

@Injectable()
export class CourseRepository {
  constructor(
    @InjectRepository(CourseEntity)
    private readonly courseRepository: Repository<CourseEntity>,
  ) {}

  async findAll(take: number, skip: number, search: string) {
    const query = this.courseRepository
      .createQueryBuilder('course')
      .orderBy('course.name', 'ASC')
      .skip(skip)
      .take(take);

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

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

    const result = data.map((course) => ({
      ...course,
    }));

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

    return response;
  }

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

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

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

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

    return query.getOne();
  }
}
