<?php
namespace App\Modules\Mobile\Supervisor;

use App\Models\Company;
use App\Models\Projects;
use App\Models\ProjectWorkersTimesheet;
use App\Http\Controllers\Controller;
use Carbon\Carbon;
use Carbon\CarbonPeriod;
use App\Traits\UserTraits;
use Illuminate\Support\Facades\Auth;

class Overview extends Controller {

    use UserTraits;

    public function fetchOverview($payload){
        $company = Company::select('name', 'street_address', 'city', 'state', 'zipcode')->where('id', $this->getCurrentUser()->company_id)->get();
        $filters = json_decode($payload->filters);
        $limit = $payload->limit;
        $page = $payload->page ? $payload->page : 1;
        $offset = $payload->offset ? $payload->offset : 1;

        $user_id = Auth::user()->id;

        $Projects = Projects::select(
            'projects.id as project_id',
            'projects.name as project_name',
            'companies.name as company_name',
            'projects.location',
            'project_supervisors.date_from as date_from',
            'project_supervisors.date_to as date_to',
        )
        ->join('project_supervisors', 'project_supervisors.project_id', '=', 'projects.id')
        ->join('companies', 'companies.id', '=', 'projects.company_id')
        ->where('project_supervisors.user_id', $user_id)
        ->whereDate('project_supervisors.date_to', '>=', Carbon::today()->toDateString())
        ->whereRaw('projects.date_end >= now()')
        ->whereNull('project_supervisors.deleted_at')
        ->get();

        $dateOptions = $this->generatePeriod(($filters && property_exists($filters, 'date')) ? $filters->date : false, $Projects);

        $Schedules = [];
        $itemCounter = $offset - 1;
        foreach ($dateOptions['period'] as $day) {
            // Handles validation for display limit.
            if ($itemCounter == $limit - 1) {
                break;
            }

            // Handles index out of range exception error
            if ($dateOptions['count'] == $itemCounter - 1) {
                break;
            }

            if ($Projects && count($Projects) != 0) {
                $projectDetails = [];
                $dayProjectCounter = 0;

                foreach ($Projects as $project) {
                    $date_from = Carbon::parse(Carbon::parse($project->date_from)->toDateString());
                    $date_to = Carbon::parse(Carbon::parse($project->date_to)->toDateString());
                    $current = Carbon::parse($dateOptions['period']->toArray()[$itemCounter]->toDateString());

                    if ($this->DateBetweenDates($current, $date_from, $date_to)) {
                        $dayProjectCounter++;
                        array_push($projectDetails, [
                                'company_name' => $project->company_name,
                                'project_name' => $project->project_name,
                                'project_id' => $project->project_id,
                                'location' => json_decode($project->location),

                            ]);
                    }
                }

                if ($dayProjectCounter == 0) {
                    array_push($Schedules, [
                            "id" => $itemCounter,
                            "date" => $dateOptions['period']->toArray()[$itemCounter],
                            "projects" =>
                            [
                                "project_name" => "Stand by",
                                "company_name" => $company[0]->name,
                                "project_id" => 1,
                                "address" => "Unavailable",
                                "location" =>
                                [
                                    "street_address" => $company[0]->street_address,
                                    "city" => $company[0]->city,
                                    "state" => $company[0]->state,
                                    "zipcode" => (int) $company[0]->zipcode,
                                ],
                            ],
                        ]
                    );
                } else {
                    array_push($Schedules, [
                            'id' => $itemCounter,
                            "projects" => $projectDetails,
                            "date" => $dateOptions['period']->toArray()[$itemCounter],
                        ]
                    );
                }
            } else {
                $Schedules = [];
                for ($x = $offset == 0 ? $offset - 1 : $offset; $x <= ($limit == 10 ? $limit - 1 : $limit); $x++) {
                    // Handles index out of range exception error
                    if ($dateOptions['count'] == $offset - 1) {
                        break;
                    }

                    array_push($Schedules,
                        [
                            "id" => $x + 1,
                            "date" => $dateOptions['period']->toArray()[($offset == 0 ? $x : $x - 1)],
                            "projects" =>
                            [
                                "project_name" => "Stand by",
                                "company_name" => $company[0]->name,
                                "project_id" => 1,
                                "address" => "Unavailable",
                                "location" =>
                                [
                                    "street_address" => $company[0]->street_address,
                                    "city" => $company[0]->city,
                                    "state" => $company[0]->state,
                                    "zipcode" => (int) $company[0]->zipcode,
                                ],
                            ],
                        ]
                    );

                    $offset = $x;
                }

                return [
                    'hits' => $Schedules,
                    'length' => count($Schedules),
                    'current_page' => $page,
                    'next_page' => $page + 1,
                    'current_offset' => $offset + 1
                ];
            }

            $itemCounter++;
        }

        return [
            'hits' => $Schedules,
            'length' => count($Schedules),
            'current_page' => $page,
            'next_page' => $page + 1,
            'current_offset' => $itemCounter + 1
        ];

    }
    public function DateBetweenDates($current, $date_from, $date_to)
    {

        return (($current->gte($date_from)) && ($current->lte($date_to)));

    }
    public function getSchedule($payload)
    {

        $date = $payload->date;

        $user_id = $this->getCurrentUser()[0]->user_id;

        $Projects = Projects::select(
            'projects.id as project_id',
            'projects.name as project_name',
            'companies.name as company_name',
            'projects.location',
            'project_supervisors.date_from as date_from',
            'project_supervisors.date_to as date_to',
        )
            ->join('project_supervisors', 'project_supervisors.project_id', '=', 'projects.id')
            ->join('companies', 'companies.id', '=', 'projects.company_id')
            ->where('project_supervisors.user_id', $user_id)

            ->whereNull('project_supervisors.deleted_at')

            ->get();

        $Schedules = [];
        if (count($Projects) == 1) {
            $days_count = Carbon::parse(Carbon::parse($date['from']))->diffInDays(Carbon::parse($date['to']));
            if ($days_count >= 11) {
                $period = CarbonPeriod::create(Carbon::parse($date['from']), Carbon::parse($date['to']));
                for ($x = 0; $x <= 9; $x++) {
                    $schedule = [
                        'id' => $x,
                        'company_name' => $Projects[0]->company_name,
                        'project_name' => $Projects[0]->project_name,
                        'project_id' => $Projects[0]->project_id,
                        'location' => json_decode($Projects[0]->location),

                    ];

                    array_push($Schedules, [$schedule, "date" => $period->toArray()[$x]]);

                }
            }
        } else if (count($Projects) > 1) {
            $days_count = Carbon::parse(Carbon::parse($date['from']))->diffInDays(Carbon::parse($date['to']));
            if ($days_count >= 11) {

                $period = CarbonPeriod::create(Carbon::parse($date['from']), Carbon::parse($date['to']));
                for ($x = 0; $x <= $days_count - 1; $x++) {

                    $project = [];

                    for ($y = 0; $y <= count($Projects) - 1; $y++) {
                        //   return $period[$x]->toArray()[$x]->between(Carbon::parse($Projects[$y]->date_from),Carbon::parse( $Projects[$y]->date_to));
                        if ($period->toArray()[$x]->between(Carbon::parse($Projects[$y]->date_from), Carbon::parse($Projects[$y]->date_to))) {
                            array_push($project, [

                                'company_name' => $Projects[$y]->company_name,
                                'project_name' => $Projects[$y]->project_name,
                                'project_id' => $Projects[$y]->project_id,
                                'location' => json_decode($Projects[0]->location),

                            ]);
                        }
                    }

                    array_push($Schedules, ['id' => $x,
                        "projects" => $project,
                        "date" => $period->toArray()[$x]]);

                }
            }
        }

        return $Schedules;

    }
    public function saveRenderedHours($payload)
    {

        $updateDetails = [
            'total_hours' => $payload->rendered_hours,
            'status' => 'submitted',
        ];
        return ProjectWorkersTimesheet::where('id', $payload->schedule_id)
            ->update($updateDetails);


    }

    public function toDataArray($data)
    {
        $arr = [];
        for ($x = 0; $x <= count($data) - 1; $x++) {
            array_push($arr, [
                "clock_in" => $data[$x]->clock_in,
                "clock_out" => $data[$x]->clock_out,
                "company_name" => $data[$x]->company_name,
                "date" => $data[$x]->date,
                "id" => $data[$x]->id,
                "location" => json_decode($data[$x]->location),
                "project_name" => $data[$x]->project_name,
                "status" => $data[$x]->status,
                "total_hours" => $data[$x]->total_hours,
            ]);
        }
        return $arr;
    }

    public function generatePeriod($date, $project)
    {

        $count = Carbon::parse(
            $date ?
            $date->from :
            $this->getServerTodayDate()
        )->diffInDays(Carbon::parse(
            $date ?
            $date->to :
            Carbon::now()->add(30, 'days')
        ));
        $datePreiod = CarbonPeriod::create(
            $date ?
            $date->from :
            $this->getServerTodayDate(),
            $date ?
            $date->to :
            Carbon::now()->add(30, 'days'));

        return [
            'count' => $count,
            'period' => $datePreiod,
        ];
    }


}
