<?php

namespace App\Modules\Company\Whiteboard\Project;

use App\Models\ProjectExpenses;
use App\Models\Projects;
use App\Models\ProjectSupervisors;
use App\Traits\CreateUserActionTraits;
use App\Traits\UserTraits;
use App\Traits\ValidatorTraits;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use App\Traits\CreateMobileNotificationTraits;

class AddProject
{
    use CreateUserActionTraits, ValidatorTraits, UserTraits, CreateMobileNotificationTraits;

    public function add($payload)
    {

        DB::beginTransaction();
        $companyId = $this->getCurrentUser()->company_id;
        $userId = Auth::user()->id;
        $projectName = $payload->project_name;
        $projectManager = $payload->project_manager;
        $supervisors = $payload->supervisors;
        $startDate = $payload->start_date;
        $endDate = $payload->end_date;
        $clockIn = $payload->clock_in;
        $clockOut = $payload->clock_out;
        $description = $payload->description;
        $additionalInfo = $payload->additional_info;
        $workerItems = $payload->worker_items;
        $locationStreetAddress = $payload->location_street_address;
        $locationCity = $payload->location_city;
        $locationState = $payload->location_state;
        $locationZipcode = $payload->location_zipcode;
        $createProjectSupervisorTransaction = true;

        // Validate Query Param
        $rules = array(
            'project_name' => 'required|max:150',
            'project_manager' => 'required',
            'supervisors' => 'required',
            'start_date' => 'required',
            'end_date' => 'required',
            'clock_in' => 'required',
            'clock_out' => 'required',
            'description' => 'required',
            'location_street_address' => 'required',
            'location_city' => 'required',
            'location_state' => 'required',
            'location_zipcode' => 'required|string|min:5',
        );
        $validate = $this->validateRequest($payload, $rules);
        if ($validate) {
            return $validate;
        }

        // Convert location to json array
        $location = array(
            'street_address' => $locationStreetAddress,
            'city' => $locationCity,
            'state' => $locationState,
            'zipcode' => $locationZipcode,
        );

        // preparing project data to be saved on database
        $projectData = array(
            'company_id' => $companyId,
            'project_manager_id' => $projectManager,
            'name' => $projectName,
            'description' => $description,
            'additional_info' => $additionalInfo,
            'date_start' => date('Y-m-d', strtotime($startDate)),
            'date_end' => date('Y-m-d', strtotime($endDate)),
            'clock_in' => date('H:i', strtotime($clockIn)),
            'clock_out' => date('H:i', strtotime($clockOut)),
            'worker_items' => json_encode($workerItems),
            'location' => json_encode($location),
            'created_by' => $userId,
        );

        // save project data to projects table
        $createProjectTransaction = Projects::create($projectData);
        $projectId = $createProjectTransaction->id;
        $supervisorList = array();
        foreach ($supervisors as $supervisor) {
            // preparing project supervisor data to be saved on database
            $startDate = $supervisor['duration'][0];
            $endDate = $supervisor['duration'][1];
            $projectSupervisorData = array(
                'user_id' => $supervisor['supervisor'],
                'project_id' => $projectId,
                'date_from' => date('Y-m-d', strtotime($startDate)),
                'date_to' => date('Y-m-d', strtotime($endDate)),
            );

            // save supervisor data to project_supervisors table
            $createProjectSupervisor = ProjectSupervisors::create($projectSupervisorData);
            if (!$createProjectSupervisor) {
                $createProjectSupervisorTransaction = false;
            }
            array_push($supervisorList, $projectSupervisorData);
        }

        // preparing project expenses data to be saved on database
        $projectExpenses = array(
            'project_id' => $projectId,
            'inhouse' => 0,
            'external' => 0,
        );

        // save project expenses data to project_expenses table
        $projectExpensesTransaction = ProjectExpenses::create($projectExpenses);

        // add a user action logs
        $saveUserActionTransaction = $this->createUserAction('Added the project ' . $projectName);

        // If there's an error or queries don't do their job, rollback!
        if (!$createProjectTransaction ||
            !$createProjectSupervisorTransaction ||
            !$projectExpensesTransaction ||
            !$saveUserActionTransaction) {
            DB::rollBack();
            return response()->json(['error' => 'Server error.']);
        } else {

            //MANAGER PWA NOTIFICATION
            $mobileNotificationData = array(
                'worker_id' => $projectManager,
                'message' => 'You have been added as Project Manager of the project named '. ucfirst($projectName) . " with project duration date of " . date('Y-m-d', strtotime($startDate)) . " to " . date('Y-m-d', strtotime($endDate)) . ".",
                'type' => 'user',
                'link' => '/company/manager/timelogs/submit',
            );
            $this->createMobileNotification($mobileNotificationData);

            // SUPERVISOR PWA NOTIFICATION
            foreach ($supervisors as $supervisor) {
                $startDate = $supervisor['duration'][0];
                $endDate = $supervisor['duration'][1];

                $mobileNotificationData = array(
                    'worker_id' => $supervisor['supervisor'],
                    'message' => 'You have been added as Project Supervisor of the project named '. ucfirst($projectName) . " with project duration date of " . date('Y-m-d', strtotime($startDate)) . " to " . date('Y-m-d', strtotime($endDate)) . ".",
                    'type' => 'user',
                    'link' => '/worker/tasks',
                );
                $this->createMobileNotification($mobileNotificationData);
            }

            DB::commit();
            return response()->json(['success' => 'Data added successfully.'])->setStatusCode(201);
        }
    }
}
