<?php

namespace App\Modules\Mobile\Authentication;

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


class CompanyUserAuthentication{

    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->checkForCompanyUserRole($worker->roles)) {
            return response()->json([
                'errors' => 'These credentials is not a company user.'
            ], 201);
        }
        
        if(!$worker->email_verified){
            return response()->json([
                'errors' => 'Please verify your email address.'
            ], 201);
        }

        if($worker->enable_2fa == 'true'){
            return response()->json([
                'success' => 'Execute 2FA'
            ], 201);
        }

        $token = $worker->createToken('access_token')->plainTextToken;
        $response = [
            'user' => $worker,
            'token' => $token,
            'refresh_token' => $token,
            'userType' => $type,
        ];

        return response($response, 201);
    }

    public function checkForCompanyUserRole($roles)
    {
        $supervisorID = 3;
        $projectManagerID = 2;
        $count = 0;

        foreach ($roles as $role){
            if ($role->role_id == $supervisorID){  //3 = id of supervisor
                $count++;
            }

            if ($role->role_id == $projectManagerID){  //2 = id of project manager
                $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();

        $worker->dateToday = \Carbon\Carbon::now()->format('Y-m-d');
        
        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);
        }
    }


}