<?php

namespace App\Modules\Company\Whiteboard\Project;

use App\Models\AssignedAvailability;
use App\Models\AssignedWorkers;
use App\Models\Projects;
use App\Traits\UserTraits;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;

class ProjectCosting
{
    use UserTraits;

    public function getData($payload, $id)
    {
        // searching
        $startDate = date('Y-m-d', strtotime($payload->start_date));
        $endDate = date('Y-m-d', strtotime($payload->end_date));

        $companyId = $this->getCurrentUser()->company_id;
        $userId = $this->getCurrentUser()->id;
        $projectData = Projects::select(
            'projects.clock_in',
            'projects.clock_out',
            'projects.date_start',
            'projects.date_end',
            'project_expenses.inhouse',
            'project_expenses.external')
            ->join('project_expenses', 'project_expenses.project_id', '=', 'projects.id')
            ->where('projects.id', $id)
            ->where('projects.company_id', $companyId)
            ->where('projects.created_by', $userId)
            ->first();

        $clockIn = $projectData->clock_out;
        $clockOut = $projectData->clock_in;
        $dateStart = $projectData->date_start;
        $dateEnd = $projectData->date_end;
        $inhouseExpense = $projectData->inhouse;
        $externalExpense = $projectData->external;
        $clockInFormatted = Carbon::parse($clockIn);
        $clockOutFormatted = Carbon::parse($clockOut);
        $dateStartFormatted = Carbon::parse($dateStart);
        $dateEndFormatted = Carbon::parse($dateEnd);
        $totalDutyHours = $clockOutFormatted->diffInMinutes($clockInFormatted) / 60;
        $totalProjectDays = $dateEndFormatted->diffInDays($dateStartFormatted) + 1;

        $actualCostToDate = $inhouseExpense + $externalExpense;
        $dailyCostBurnRate = $actualCostToDate / $totalProjectDays;
        $totalProjectedCost = $this->totalProjectedCost($id, $startDate, $endDate, $totalDutyHours);
        $totalProjectedCost = $totalProjectedCost + $actualCostToDate;

        return [
            'actualCostToDate' => $actualCostToDate,
            'dailyCostBurnRate' => $dailyCostBurnRate,
            'totalProjectedCost' => $totalProjectedCost,
        ];
    }

    public function totalProjectedCost($id, $startDate, $endDate, $totalDutyHours)
    {
        $actualCostToDate = 0;
        // $today = date('Y-m-d');
        $assignedAvailabilityData = AssignedAvailability::select(
            'assigned_availability.rate',
            'assigned_availability.start_date',
            'assigned_availability.end_date')
            ->join('assigned_workers', 'assigned_workers.id', '=', 'assigned_availability.assigned_worker_id')
            ->where('assigned_workers.project_id', $id)
            ->where(function ($query) use ($startDate, $endDate) {
                $query->where('assigned_availability.start_date', $startDate)
                    ->orWhere('assigned_availability.end_date', $endDate)
                    ->orWhereBetween('assigned_availability.start_date', [$startDate, $endDate])
                    ->orWhereBetween('assigned_availability.end_date', [$startDate, $endDate])
                    ->orWhereRaw('? BETWEEN assigned_availability.start_date and assigned_availability.end_date', [$startDate])
                    ->orWhereRaw('? BETWEEN assigned_availability.start_date and assigned_availability.end_date', [$endDate]);
            })
            // ->where('assigned_availability.end_date', '>=', $today)
            ->get();

        foreach ($assignedAvailabilityData as $assignedAvailability) {
            $rate = $assignedAvailability->rate;
            $startDate = $assignedAvailability->start_date;
            $endDate = $assignedAvailability->end_date;
            $startDateFormatted = Carbon::parse($startDate);
            $endDateFormatted = Carbon::parse($endDate);
            $totalWorkDays = $startDateFormatted->diffInDays($endDateFormatted) + 1;
            $actualCostToDate = $actualCostToDate + ($rate * $totalDutyHours * $totalWorkDays);
        }

        return $actualCostToDate;
    }

    public function totalSumOfWorkerRatesAssignedOnProject($projectID){
        $data = AssignedWorkers::select(
            DB::raw('SUM(workers.rate) as total_rate'),
        )
        ->join('workers', 'workers.id', 'assigned_workers.worker_id')
        ->where('project_id', $projectID)
        ->first();

        return $data->total_rate;
    }
}
