import {
  RentalCarCheckout,
  Trips,
  RentalCarDropOffType,
  RentalCarLocationType,
  RentalCarUtility,
  RentalCarParams,
  LocationUtility
} from '@rentalCar-lib/index';

const newUserCredentials = Cypress.env('newUser').NEW_USER_PASSWORD;
const outOfPolicy = 'Yes';
const adminDecision = 'decline';

export enum RentalCarPolicyStatus {
  Rejected = 'Rejected',
  Pending = 'Pending Approval'
}

enum RentalCarPolicyType {
  Cost = 'cost',
  Class = 'class'
}

const createRentalCarParams = (policyType: RentalCarPolicyType): RentalCarParams => ({
  tripTileType: 'Business',
  dropOffType: RentalCarDropOffType.sameDropOff,
  pickUpLocation: LocationUtility.getRentalCarAirportUS(),
  outOfPolicy: outOfPolicy,
  dropOffLocation: LocationUtility.getRentalCarAirportUS(),
  rentalCarLocationType: RentalCarLocationType.airport,
  policyType: policyType
});

export class RentalCarPolicyModal {
  static declineRentalCarPolicyBooking(policyType: RentalCarPolicyType) {
    const rentalCarParams = createRentalCarParams(policyType);
    RentalCarUtility.bookRentalCar(rentalCarParams);
    RentalCarCheckout.expectBookingSuccessfully();
    Trips.verifyTripStatus(RentalCarPolicyStatus.Pending);
    RentalCarCheckout.adminApproveOrDeclineRentalCarBooking(
      newUserCredentials,
      adminDecision
    );
    Trips.canceledTrip();
    Trips.verifyTripStatus(RentalCarPolicyStatus.Rejected);
    Trips.expectDriverNameIsCorrect();
  }

  static declineRentalCarClassPolicyBooking() {
    this.declineRentalCarPolicyBooking(RentalCarPolicyType.Class);
  }

  static declineRentalCarCostPolicyBooking() {
    this.declineRentalCarPolicyBooking(RentalCarPolicyType.Cost);
  }
}
