import { maintenance } from "../../../entity/unit/maintenance";
import { MaintenanceAssigned, MaintenanceViewModel } from "../../../viewmodel/admin/unit/maintenance.models";
import DamageReportFactory from "./damageReport";
import EquipmentFactory from "./equipment/equipment";
import VehicleFactory from "./vehicle/vehicle";
import WearableFactory from "./wearable/wearable";

export default abstract class MaintenanceFactory {
  /**
   * @description map record to maintenance
   * @param {maintenance} record
   * @returns {MaintenanceViewModel}
   */
  public static mapToSingle(record: maintenance): MaintenanceViewModel {
    let assigned: MaintenanceAssigned;
    if (record?.equipmentId) {
      assigned = {
        relatedId: record.equipmentId,
        assigned: "equipment",
        related: EquipmentFactory.mapToSingle(record.equipment),
      };
    } else if (record?.vehicleId) {
      assigned = {
        relatedId: record.vehicleId,
        assigned: "vehicle",
        related: VehicleFactory.mapToSingle(record.vehicle),
      };
    } else {
      assigned = {
        relatedId: record.wearableId,
        assigned: "wearable",
        related: WearableFactory.mapToSingle(record.wearable),
      };
    }

    return {
      id: record.id,
      createdAt: record.createdAt,
      status: record.status,
      done: record.done,
      description: record.description,
      ...assigned,
      reports: record.reports ? DamageReportFactory.mapToBase(record.reports) : [],
    };
  }

  /**
   * @description map records to maintenance
   * @param {Array<maintenance>} records
   * @returns {Array<MaintenanceViewModel>}
   */
  public static mapToBase(records: Array<maintenance>): Array<MaintenanceViewModel> {
    return records.map((r) => this.mapToSingle(r));
  }
}