<?php

namespace App\Modules\Mobile\Authentication;

use App\Models\Worker;
use App\Models\CompanyUser;
use App\Models\AccessRole;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;

class WorkerAuthentication
{

    public function login($payload)
    {
        $email_address = $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 = Worker::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', $email_address)
            ->first();

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

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

        if (!$worker->email_verified) {
            return response()->json([
                'errors' => '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 checkForWorkerRole($roles)
    {
        $count = 0;
        foreach ($roles as $role) {
            if ($role->role_id == 5) { //5 = id of worker
                $count++;
            }
        }
        return ($count > 0) ? true : false;
    }

    public function userData($payload)
    {
        $email_address = $payload->user()->email_address;
        $worker = Worker::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', $email_address)
            ->first();

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

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

    public function logout($payload)
    {
        $user = request()->user();
        $isLoggedOut = $user->tokens()->where('id', $user->currentAccessToken()->id)->delete();
        if ($isLoggedOut) {
            return response()->json(['success' => 'Worker successfully logged out.'])->setStatusCode(201);
        } else {
            return response()->json(['error' => 'Something went wrong on logged out of user.'])->setStatusCode(201);
        }
    }

    public function getUserAccess()
    {

        $id = Auth::user()->id;
        $rolesList = CompanyUser::where('worker_id', $id)->get();
        $roles = array();

        foreach ($rolesList as $role) {
            array_push($roles, $role->role_id);
        }
        $accessList = AccessRole::select(
            'access.page'
        )
            ->join('access', 'access.id', 'access_roles.access_id')
            ->whereIn('access_roles.role_id', $roles)
            ->get();

        $access = array();
        foreach ($accessList as $role) {
            array_push($access, $role->page);
        }
        return $access;
    }

}
