import { Injectable } from "@nestjs/common"
import { InjectRepository } from "@nestjs/typeorm"
import { Repository } from "typeorm"
import { BaseAbstractRepository } from "../../../common/repository/base.repository"
import { AddOn } from "../entities/add-ons.entity"

@Injectable()
export class AddOnRepository extends BaseAbstractRepository<AddOn> {
  constructor(
    @InjectRepository(AddOn)
    private readonly AddOnRepository: Repository<AddOn>,
  ) {
    super(AddOnRepository)
  }
  async findWithVehicleModelFilter(
    limit?: number,
    skip?: number,
    search?: string,
    sortBy?: string,
    sortOrder?: "ASC" | "DESC",
    vehicle_model_ids?: number[],
  ) {
    const validSortColumns = ["id", "name", "created_at", "updated_at"]
    const order: "ASC" | "DESC" = sortOrder === "ASC" ? "ASC" : "DESC"
    const sortColumn = validSortColumns.includes(sortBy) ? sortBy : "created_at"

    const query = this.AddOnRepository.createQueryBuilder("addOn")
      .leftJoinAndSelect("addOn.vehicleModels", "vehicleModel")
      .where("1=1")

    if (search) {
      query.andWhere("addOn.name ILIKE :search", { search: `%${search}%` })
    }

    if (vehicle_model_ids && vehicle_model_ids.length > 0) {
      query.andWhere("vehicleModel.id IN (:...vehicle_model_ids)", {
        vehicle_model_ids,
      })
    }

    query.orderBy(`addOn.${sortColumn}`, order)

    if (limit) {
      query.take(limit)
    }

    if (skip) {
      query.skip(skip)
    }

    const [data, count] = await query.getManyAndCount()
    return { data, count }
  }
}
