<?php

namespace App\Modules\Company\Whiteboard\Project;

use App\Http\Resources\Company\WorkerTimesheet as WorkerTimesheetResource;
use App\Models\ProjectWorkersTimesheet;
use App\Traits\SearchTraits;
use App\Traits\SortingTraits;
use App\Traits\UserTraits;
use App\Traits\ValidatorTraits;

class WorkerTimesheet
{
    use SortingTraits, SearchTraits, UserTraits, ValidatorTraits;

    public function getData($payload)
    {
        $companyId = $this->getCurrentUser()->company_id;
        $projectId = $payload->project_id;

        // sorting
        $sortField = $this->sortField($payload, 'date'); // first_name = default column to search
        $sortOrder = $this->sortOrder($payload, 'desc');

        // searching
        $nameSearch = $this->searchField($payload->first_name);
        $workerIdSearch = $this->searchField($payload->worker_id);
        $dateSearch = date('Y-m-d', strtotime($payload->date));
        $workerTypeSearch = $payload->worker_type;

        // validate query params
        $rules = array(
            'date' => 'required',
        );
        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

        return WorkerTimesheetResource::collection(
            ProjectWorkersTimesheet::select(
                'project_workers_timesheet.id',
                'project_workers_timesheet.project_worker_id',
                'project_workers_timesheet.worker_type',
                'project_workers_timesheet.total_hours',
                'project_workers_timesheet.date',
                'project_workers_timesheet.time_in',
                'project_workers_timesheet.time_out',
                'project_workers_timesheet.status',
                'project_workers_timesheet.request_modification_message',
                'project_workers_timesheet.requested_by',
                'project_workers_timesheet.approved_by',
                'worker.id as worker_id',
                'worker.worker_id as company_worker_id',
                'worker.first_name',
                'worker.last_name')
                ->join('workers as worker', 'worker.id', '=', 'project_workers_timesheet.worker_id')
                ->join('assigned_workers', 'assigned_workers.id', '=', 'project_workers_timesheet.project_worker_id')
                ->join('projects', 'projects.id', '=', 'assigned_workers.project_id')
                ->where('projects.company_id', $companyId)
                ->where('project_workers_timesheet.date', $dateSearch)
                ->where('projects.id', $projectId)
                ->when(!empty($workerIdSearch), function ($query) use ($workerIdSearch) {
                    return $query->where('worker.worker_id', 'LIKE', $workerIdSearch . '%');
                })
                ->when(!empty($workerTypeSearch), function ($query) use ($workerTypeSearch) {
                    return $query->whereIn('project_workers_timesheet.worker_type', $workerTypeSearch);
                })
                ->when(!empty($nameSearch), function ($query) use ($nameSearch) {
                    return $query->where(function ($query) use ($nameSearch) {
                        $query->where('worker.first_name', 'LIKE', $nameSearch . '%')
                            ->orWhere('worker.last_name', 'LIKE', $nameSearch . '%');
                    });
                })
                ->orderBy($sortField, $sortOrder)
                ->paginate(20)
        )->response()->setStatusCode(201);
    }
}
