// Owen Sullivan, Lucia Wang, Geeth Chilukuri
// CPSC 1021-001
// Lab 5

// Invoice.h worked on by Lucia Wang (primary), Owen Sullivan (secondary)

// Header guard for Invoice.h
#ifndef INVOICE_
#define INVOICE_

// Include custom header files
#include "CustomerType_Employee.h"
#include "CustomerType_Student.h"
#include "CustomerType_Vendor.h"
#include "VehicleType_Car.h"
#include "VehicleType_Truck.h"
#include "VehicleType_Motorcycle.h"

// Declare Invoice class
class Invoice {

    private:
        // Store prices used in calculations as constants
        const double annualPermitBasePrice = 100.00;
        const double semesterPermitBasePrice = 50.00;
        const double oneDayPermitBasePrice = 15.00;
        const double parkAndRidePermitBasePrice = 75.00;
        const double employeeAddedPrice = 5.00;
        const double studentAddedPrice = 25.00;
        const double vendorAddedPrice = 10.00;
        const double professorDiscount = 10.00;
        const double tenuredDiscount = 10.00;
        const double residentFee = 50.00;
        const double TAdiscount = 25.00;
        const double foodServiceDiscount = 10.00;
        const double constructionDiscount = 10.00;
        const double carAddedPrice = 10.00;
        const double truckAddedPrice = 15.00;
        const double motorcycleAddedPrice = 5.00;
        const double electricDiscount = 25.00;
        const double compactDiscount = 5.00;
        const double wideFee = 15.00;
        const double dieselFee = 5.00;
        const double mopedDiscount = 20.00;
        const double twoSeaterFee = 20.00;

    public:
        // Getter functions
        double getAnnualPermitBasePrice();
        double getSemesterPermitBasePrice();
        double getOneDayPermitBasePrice();
        double getParkAndRidePermitBasePrice();
        double getEmployeeAddedPrice();
        double getStudentAddedPrice();
        double getVendorAddedPrice();
        double getProfessorDiscount();
        double getTenuredDiscount();
        double getResidentFee();
        double getTAdiscount();
        double getFoodServiceDiscount();
        double getConstructionDiscount();
        double getCarAddedPrice();
        double getTruckAddedPrice();
        double getMotorcycleAddedPrice();
        double getElectricDiscount();
        double getCompactDiscount();
        double getWideFee();
        double getDieselFee();
        double getMopedDiscount();
        double getTwoSeaterFee();
        // Overloaded calculation functions (one for each combination of CustomerType and VehicleType classes, for pass by reference)
        double calcTotal(char permitTypeInput, CustomerType_Employee &customerTypeObject, VehicleType_Car &vehicleTypeObject);
        double calcTotal(char permitTypeInput, CustomerType_Employee &customerTypeObject, VehicleType_Truck &vehicleTypeObject);
        double calcTotal(char permitTypeInput, CustomerType_Employee &customerTypeObject, VehicleType_Motorcycle &vehicleTypeObject);
        double calcTotal(char permitTypeInput, CustomerType_Student &customerTypeObject, VehicleType_Car &vehicleTypeObject);
        double calcTotal(char permitTypeInput, CustomerType_Student &customerTypeObject, VehicleType_Truck &vehicleTypeObject);
        double calcTotal(char permitTypeInput, CustomerType_Student &customerTypeObject, VehicleType_Motorcycle &vehicleTypeObject);
        double calcTotal(char permitTypeInput, CustomerType_Vendor &customerTypeObject, VehicleType_Car &vehicleTypeObject);
        double calcTotal(char permitTypeInput, CustomerType_Vendor &customerTypeObject, VehicleType_Truck &vehicleTypeObject);
        double calcTotal(char permitTypeInput, CustomerType_Vendor &customerTypeObject, VehicleType_Motorcycle &vehicleTypeObject);
        // Overloaded print functions (one for each combination of CustomerType and VehicleType classes, for pass by reference)
        void printInvoice(char permitTypeInput, CustomerType_Employee &customerTypeObject, VehicleType_Car &vehicleTypeObject);
        void printInvoice(char permitTypeInput, CustomerType_Employee &customerTypeObject, VehicleType_Truck &vehicleTypeObject);
        void printInvoice(char permitTypeInput, CustomerType_Employee &customerTypeObject, VehicleType_Motorcycle &vehicleTypeObject);
        void printInvoice(char permitTypeInput, CustomerType_Student &customerTypeObject, VehicleType_Car &vehicleTypeObject);
        void printInvoice(char permitTypeInput, CustomerType_Student &customerTypeObject, VehicleType_Truck &vehicleTypeObject);
        void printInvoice(char permitTypeInput, CustomerType_Student &customerTypeObject, VehicleType_Motorcycle &vehicleTypeObject);
        void printInvoice(char permitTypeInput, CustomerType_Vendor &customerTypeObject, VehicleType_Car &vehicleTypeObject);
        void printInvoice(char permitTypeInput, CustomerType_Vendor &customerTypeObject, VehicleType_Truck &vehicleTypeObject);
        void printInvoice(char permitTypeInput, CustomerType_Vendor &customerTypeObject, VehicleType_Motorcycle &vehicleTypeObject);

};

#endif