import { dataSource } from "../../../data-source";
import { inspection } from "../../../entity/unit/inspection/inspection";
import DatabaseActionException from "../../../exceptions/databaseActionException";

export default abstract class InspectionService {
  /**
   * @description get all inspections for related
   * @returns {Promise<Array<inspection>>}
   */
  static async getAllForRelated(where: { equipmentId: string } | { vehicleId: string }): Promise<Array<inspection>> {
    return await dataSource
      .getRepository(inspection)
      .createQueryBuilder("inspection")
      .leftJoinAndSelect("inspection.inspectionPlan", "inspectionPlan")
      .leftJoinAndSelect("inspection.inspectionVersionedPlan", "inspectionVersionedPlan")
      .leftJoinAndSelect("inspectionVersionedPlan.inspectionPoints", "inspectionPoints")
      .leftJoinAndSelect("inspection.pointResults", "pointResults")
      .leftJoinAndSelect("pointResults.inspectionPoint", "inspectionPoint")
      .leftJoinAndSelect("inspection.equipment", "equipment")
      .leftJoinAndSelect("inspection.vehicle", "vehicle")
      .where(where)
      .orderBy("createdAt", "DESC")
      .getMany()
      .then((res) => {
        return res;
      })
      .catch((err) => {
        throw new DatabaseActionException("SELECT", "inspection", err);
      });
  }

  /**
   * @description get inspection by id
   * @returns {Promise<inspection>}
   */
  static async getById(id: string): Promise<inspection> {
    return await dataSource
      .getRepository(inspection)
      .createQueryBuilder("inspection")
      .leftJoinAndSelect("inspection.inspectionPlan", "inspectionPlan")
      .leftJoinAndSelect("inspection.inspectionVersionedPlan", "inspectionVersionedPlan")
      .leftJoinAndSelect("inspectionVersionedPlan.inspectionPoints", "inspectionPoints")
      .leftJoinAndSelect("inspection.pointResults", "pointResults")
      .leftJoinAndSelect("pointResults.inspectionPoint", "inspectionPoint")
      .leftJoinAndSelect("inspection.equipment", "equipment")
      .leftJoinAndSelect("inspection.vehicle", "vehicle")
      .where({ id })
      .getOneOrFail()
      .then((res) => {
        return res;
      })
      .catch((err) => {
        throw new DatabaseActionException("SELECT", "inspection", err);
      });
  }
}