<?php

namespace App\Listeners\Company;

use App\Events\Company\InvoiceUpdateEvent;


use App\Models\ProjectExpenses;
use App\Models\InboundBillingRequests;
use App\Models\ProjectWorkersTimesheet;
use App\Events\Company\ApprovedTimesheetEvent;
class CalculateOutstandingByHoursRenderedListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        // sadasdas
    }

    /**
     * Handle the event.
     *
     * @param  object  $event
     * @return void
     */
    public function handle(InvoiceUpdateEvent $event)
    {
        if ($event->transaction == "invoice" && $event->action == "approve") {

            $IBR = InboundBillingRequests::join('loan_borrow_lists', 'loan_borrow_lists.id', 'inbound_billing_requests.loan_borrow_lists_id')
                ->where('inbound_billing_requests.loan_borrow_lists_id', $event->reference_id)->first();

            // var_dump('hi');
            $days = json_decode($IBR->days);

            $dates = array();
            $totalOutstanding = 0;
            $total_hours = 0;
            foreach ($days as $day) {

                array_push($dates, $day->date);
                $total_hours += $day->hours;
            }

            $timesheets = ProjectWorkersTimesheet::whereIn("date", $dates)
                ->where("worker_id", "=", $IBR->worker_id)
                ->get();

            foreach ($timesheets as $timesheet) {

                $timesheet->total_billing_per_day = ($total_hours != 0 ? (floatval($IBR->total_billing) / $total_hours) : 0) * $timesheet->total_hours;
                $timesheet->status = "approved";
                $timesheet->save();
                event(new ApprovedTimesheetEvent($timesheet->id, 'timesheet', 'approve'));

            }

            $this->processProjectExpense($IBR->id, $IBR->worker_id, $dates);
            // var_dump($this->processProjectExpense($IBR->id, $IBR->worker_id, $dates));
            // Log::channel('background')->info("Approved ".$event->transaction." => ". $event->reference_id ." Total hours: ". $total_hours . " Outstanding: ".$IBR->total_billing. " Outstanding per hour: ". (floatval($IBR->total_billing)/$total_hours) );
        }
    }

    public function processProjectExpense($IBR_id, $worker_id, $dates)
    {

        $data = InboundBillingRequests::select(
            'assigned_workers.project_id as project_id',
            'project_workers_timesheet.total_billing_per_day',
            'project_workers_timesheet.worker_type',
            'project_workers_timesheet.date'
        )
            ->join('loan_borrow_lists', 'inbound_billing_requests.loan_borrow_lists_id', 'loan_borrow_lists.id')
            ->join('project_workers_timesheet', 'loan_borrow_lists.worker_id', 'project_workers_timesheet.worker_id')
            ->join('assigned_workers', 'project_workers_timesheet.project_worker_id', 'assigned_workers.id')
            ->where('inbound_billing_requests.id', $IBR_id)
            ->where('project_workers_timesheet.worker_id', $worker_id)
            ->whereIn("project_workers_timesheet.date", $dates)
            ->get();

        $projects = array_unique(array_column($data->toArray(), 'project_id'));
        $entries = array();
        $success = false;
        foreach ($projects as $project) {
            $internal_expense = 0;
            $external_expense = 0;
            $projectExpense = ProjectExpenses::where('project_id', $project)->first();

            foreach ($data as $datum) {

                if ($datum->project_id == $project) {

                    if ($datum->worker_type == 'borrowed') {
                        $external_expense += $datum->total_billing_per_day;
                    } else {
                        $internal_expense += $datum->total_billing_per_day;
                    }

                }

            }

            if ($projectExpense) {
                $success = ProjectExpenses::where('id', $projectExpense->id)
                    ->update([
                        'inhouse' => $projectExpense->inhouse + $internal_expense,
                        'external' => $projectExpense->inhouse + $external_expense,
                    ]);

            } else {
                $success = ProjectExpenses::create([
                    'project_id' => $project,
                    'inhouse' => $internal_expense,
                    'external' => $external_expense,
                ]);
            }

        }

        return $success;

    }
}
