import { Injectable } from "@nestjs/common"
import { InjectRepository } from "@nestjs/typeorm"
import { Repository } from "typeorm"
import { BaseAbstractRepository } from "../../../common/repository/base.repository"
import { DriverFleetHistory } from "../entities/driver-fleet-history.entity"
import { FleetManagement } from "../entities/fleet-management.entity"

@Injectable()
export class DriverFleetHistoryRepository extends BaseAbstractRepository<DriverFleetHistory> {
  constructor(
    @InjectRepository(DriverFleetHistory)
    private readonly driverFleetHistoryRepository: Repository<DriverFleetHistory>,
  ) {
    super(driverFleetHistoryRepository)
  }

  async findTripsByDriverId(driverId: number): Promise<FleetManagement> {
    const activeAssignment = await this.driverFleetHistoryRepository
      .createQueryBuilder("driverFleetHistory")
      .leftJoinAndSelect("driverFleetHistory.fleet", "fleet")
      .leftJoinAndSelect("fleet.state_details", "state_details")
      .leftJoinAndSelect("fleet.vehicleModel", "vehicleModel")
      .leftJoinAndSelect("fleet.vehicle_manufacture", "vehicle_manufacture")
      .leftJoinAndSelect("fleet.vehicleInsurances", "vehicleInsurances")
      .where("driverFleetHistory.driver_id = :driverId", { driverId })
      .andWhere("driverFleetHistory.released_at IS NULL")
      .select([
        "driverFleetHistory.id",
        "driverFleetHistory.assigned_at",
        "driverFleetHistory.released_at",

        "fleet.id",
        "fleet.car_code",
        "fleet.year",
        "fleet.color",
        "fleet.registration_number",
        "fleet.vin_number",
        "fleet.registration_document",

        "state_details.id",
        "state_details.name",

        "vehicleModel.id",
        "vehicleModel.name",

        "vehicle_manufacture.id",
        "vehicle_manufacture.name",

        "vehicleInsurances.id",
        "vehicleInsurances.policy_number",
        "vehicleInsurances.start_date",
        "vehicleInsurances.end_date",
        "vehicleInsurances.document_file",
        "vehicleInsurances.status",
      ])
      .getOne()

    // Return the active fleet directly
    return activeAssignment?.fleet || null
  }
}
