<?php

namespace App\Modules\Mobile;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use App\Models\LoanBorrowList;
use App\Models\Worker as CompanyWorker;

use Illuminate\Support\Facades\Validator;


class Worker
{
    public function login($payload) {
        $emailAddress = $payload->email_address;
        $password = $payload->password;
        $type= $payload->type;

        $rules = array(
            'email_address' => 'required|max:255',
            'password'      => 'required|max:255',
        );

        $error = Validator::make($payload->all(), $rules);

        if ($error->fails()) {
            return response()->json(['errors' => $error->errors()->all()]);
        }

        $worker = CompanyWorker::select(
            'workers.email_address',
            'workers.password',
            'workers.first_name',
            'workers.last_name',
            'companies.name as company_name',
            'workers.id',
            'workers.phone_num',
            DB::raw('IFNULL( workers.email_verified_at, 0) as email_verified'),
            'workers.is_active',
            'company_users.company_id',
            'companies.is_banned as company_is_banned',
            'companies.street_address',
            'companies.city',
            'companies.state',
            'companies.zipcode',
            'companies.company_tel as contact',
            'companies.type as company_type',
        )
        ->with('roles:worker_id,role_id,name')
        ->join('company_users','company_users.worker_id' , "=", 'workers.id')
        ->join('companies' , 'companies.id', '=', 'company_users.company_id')
        ->where('workers.email_address', $emailAddress)
        ->first();

        if (!$worker || !Hash::check($password, $worker->password)) {
            return response()->json([
                'message' => ['These credentials do not match our records.']
            ], 201);
        }

        if ($type == "worker") {
            if (!$this->checkForWorkerRole($worker->roles)) {
                return response()->json([
                    'message' => ['These credentials is not a worker.'],
                ], 201);
            }
        }

        if (!$worker->email_verified){
            return response()->json([
                'message' => ['Please verify your email address.']
            ], 201);
        }

        $token = $worker->createToken('access_token')->plainTextToken;

        $response = [
            'user'          => $worker,
            'token'         => $token,
            'refresh_token' => $token,
            'userType'      => $type,
        ];

        return response($response, 201);
    }

    public function getDetails($payload) {
        $emailAddress = $payload->user()->email_address;

        $worker = CompanyWorker::select(
            'workers.email_address',
            'workers.password',
            'workers.first_name',
            'workers.last_name',
            'companies.name as company_name',
            'workers.id',
            'workers.phone_num',
            DB::raw('IFNULL( workers.email_verified_at, 0) as email_verified'),
            'workers.is_active',
            'company_users.company_id',
            'companies.is_banned as company_is_banned',
            'companies.street_address',
            'companies.city',
            'companies.state',
            'companies.zipcode',
            'companies.company_tel as contact',
            'companies.type as company_type',
        )
        ->with('roles:worker_id,role_id,name')
        ->join('company_users','company_users.worker_id' , "=", 'workers.id')
        ->join('companies' , 'companies.id', '=', 'company_users.company_id')
        ->where('workers.email_address', $emailAddress)
        ->first();

        return ['user' => $worker];
    }

    public function logout($payload) {
        $user           = request()->user();
        $isLoggedOut    = $user->tokens()->where('id', $user->currentAccessToken()->id)->delete();

        if ($isLoggedOut) {
            return response()->json(['success' => 'User successfully logged out.'])->setStatusCode(201);
        } else {
            return response()->json(['error' => 'Something went wrong on logged out of user.'])->setStatusCode(201);
        }
    }

    public function refresh($payload) {
        return [
            'token'         => $payload->refresh_token,
            'refresh_token' => $payload->refresh_token
        ];
    }

    public function checkForWorkerRole($roles){
        $count = 0;
        foreach ($roles as $role){
            if ($role->role_id == 5) {  //5 = id of worker
                $count++;
            }
        }
        return ($count > 0)? true: false;
    }

    public static function getBorrowerCompany($worker_id, $date) {
        $result = LoanBorrowList::select(
            'companies.name',
            'companies.street_address',
            'companies.city',
            'companies.state',
            'companies.zipcode',
            'companies.company_tel',
            'companies.contact_person_name',
            'loan_borrow_lists.date_from',
            'loan_borrow_lists.date_to'
        )
        ->join('companies', 'companies.id', '=', 'loan_borrow_lists.borrower_company_id')
        ->where(function ($query) use ($date) {
            $query->where('date_from', $date)
                ->orWhere('date_to', $date)
                ->orWhereBetween('date_from', [$date, $date])
                ->orWhereBetween('date_to', [$date, $date])
                ->orWhereRaw('? BETWEEN date_from and date_to', [$date])
                ->orWhereRaw('? BETWEEN date_from and date_to', [$date]);
        })
        ->where('loan_borrow_lists.worker_id', $worker_id)
        ->first();

        return $result;
    }
}
