<?php

namespace App\Traits;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

trait CalculateBillableRateTrait
{

    public function CalculateBillableRate($rate_details)
    {
        $overHeadedRate = 0;
        $totalRate = 0;
        $hourlyBurdenRate = 0;
        $burdenedRate = 0;

        switch ($rate_details['burden_rate']['type']) {
            case 'percent':
                $hourlyBurdenRate = (($rate_details['flat_rate'] * (0.01 * $rate_details['burden_rate']['amount'])));
                $burdenedRate = $rate_details['flat_rate'] + (($rate_details['flat_rate'] * (0.01 * $rate_details['burden_rate']['amount'])));
                break;
            case 'real':
                $hourlyBurdenRate = $rate_details['burden_rate']['amount'];
                $burdenedRate = $rate_details['flat_rate'] + $rate_details['burden_rate']['amount'];
                break;
        }

        switch ($rate_details['overhead']['type']) {
            case 'percent':
                $overHeadedRate = $rate_details['flat_rate'] + ($hourlyBurdenRate + ($burdenedRate * (0.01 * $rate_details['overhead']['amount'])));
                break;
            case 'real':
                $overHeadedRate = $rate_details['flat_rate'] + ($burdenedRate + $rate_details['overhead']['amount']);
                break;
        }

        $totalRate = $overHeadedRate + ($overHeadedRate * (0.01 * $rate_details['service_charge']));

        return [
            "searchRate" => $totalRate,
            "overheaded" => $overHeadedRate,
            "burdenRate" => $hourlyBurdenRate,
        ];

    }
    public function CalculateWorkerBillableRate($rate_details)
    {
        $overHeadedRate = 0;
        $hourlyBurdenRate = 0;

        switch ($rate_details['burden_rate']['type']) {

            case 'percent':

                $hourlyBurdenRate = (($rate_details['flat_rate'] * (0.01 * $rate_details['burden_rate']['amount'])));
                break;
            case 'real':
                $hourlyBurdenRate = $rate_details['burden_rate']['amount'];
                break;

        }

        switch ($rate_details['overhead']['type']) {
            case 'percent':
                $overHeadedRate = (($rate_details['flat_rate'] + $hourlyBurdenRate) + ($rate_details['flat_rate'] * (0.01 * $rate_details['overhead']['amount'])));
                break;
            case 'real':
                $overHeadedRate = (($rate_details['flat_rate'] + $hourlyBurdenRate) + $rate_details['overhead']['amount']);
                break;
        }

        return [
            "overheaded" => $overHeadedRate,
            "flat_rate" => $rate_details['flat_rate'],
        ];

    }


    /*
        Billable Rate:   10% of original rate + origina rate. This data should be saved on (workers.rate table) : additional charge to be given to loaner company
        Burden rate:     %s. or amount to be added, percentage amount will be based on worker experience burden rate : : additional charge to be given to worker 
        Overhead amount: % or amount to be added, percenrate/amount will be based on worker (table) overhead charge and type : : additional charge to be given to loaner company
        Service Charge:  % or amount to be added, percenrate/amount will be based on companies (table) service charge : additional charge to be given to conx

        Search Rate:  Billable rate + (billable rate % service_charge) + overhead amount + burden rate
    */
    public function newComputationOfBillableRate($payload){

        $workerRate = $payload->hourly_rate; //original rate

        $burdenAmount = (float) $payload->burden_rate;
        $overHeadAmount = (float) $payload->overheadAmount;
        $serviceCharge = (float) $payload->service_charge;


        $overHeadToAdd = 0;
        $burdenRateToAdd = 0;
        $serviceChargeToAdd = 0;

        //compute billable rate: additional 10 percent of worker rate
        // $billableRate = ($workerRate * (10 / 100)) + $workerRate; 
        
        // get burdenrate value : % on workerRate
        if($payload->burden_rate_type == 'percent'){
            $burdenRateToAdd = ($burdenAmount / 100) * $workerRate;
        }else{
            $burdenRateToAdd = $burdenAmount;
            
        }

        $loadedRate = $burdenRateToAdd + $workerRate;

        //get overhead value : % on workerRate
        if($payload->overheadType == 'percent'){
            // $overHeadToAdd = ($overHeadAmount / 100) * $workerRate;
            $overHeadToAdd = ($overHeadAmount / 100) * $loadedRate;
            
        }else{
            $overHeadToAdd = $overHeadAmount;
        }
        $billableRate = $loadedRate + $overHeadToAdd;

        //get service charge value: % on billable rate
        $serviceChargeToAdd = ($serviceCharge / 100 ) * $billableRate;

        // search rate
        // $searchRate = $billableRate + $burdenRateToAdd + $overHeadToAdd + $serviceChargeToAdd;
        $searchRate = $serviceChargeToAdd + $billableRate;

        //Table to be updated
        // Worker and Search table

        return (object)[
            'searchRate' =>  $searchRate,
            'billableRate' =>  $billableRate,
            'originalRate' =>  $workerRate,
            'serviceChargeToAdd' =>  $serviceChargeToAdd,
            'overHeadToAdd' =>  $overHeadToAdd,
            'burdenRateToAdd' =>  $loadedRate,
            'newRate' =>  $workerRate + $overHeadToAdd,
            'overHeadAmount' =>  $overHeadAmount,
            'overHeadType' =>  $payload->overheadType,
            'loadedRate' => $loadedRate,
        ];

    }
}
