<?php

namespace App\Modules\Company\Authentication;

use App\Models\CompanyExperience;
use App\Models\Expertise;
use App\Models\WorkAreas;
use App\Models\Worker;
use Illuminate\Support\Facades\Hash;

class LoginByPassword
{
    public function login($payload)
    {
        $allowedRoles = array(1, 2, 3, 4); // 1 = Owner / Admin, 2 = Project Manager, 3 = Supervisor, 4 = Accountant
        $isUserAllowedToLogin = false;
        $emailAddress = $payload->email_address;
        $password = $payload->password;

        $worker = Worker::select(
            'workers.id',
            'workers.email_address',
            'workers.password',
            'workers.email_verified_at',
            'workers.is_account_disabled',
            'company_users.company_id')
            ->with('roles:worker_id,role_id,name')
            ->join('company_users', 'company_users.worker_id', '=', 'workers.id')
            ->where('workers.email_address', $emailAddress)
            ->first();
        if ($worker && $worker->email_verified_at == null) {
            return response()->json([
                'errors' => ['Please verify your email address.'],
            ], 201);
        } else if (!$worker || !Hash::check($password, $worker->password)) {
            return response()->json([
                'errors' => ['These credentials do not match our records.'],
            ], 201);
        } else if ($worker->is_account_disabled == 'true') {
            return response()->json([
                'errors' => ['Account currently disabled. Please contact your company administator.'],
            ], 201);
        }

        foreach ($worker->roles as $role) {
            if (in_array($role->role_id, $allowedRoles)) {
                $isUserAllowedToLogin = true;
                break;
            }
        }

        // Check Role
        if ($isUserAllowedToLogin == false) {
            return response()->json([
                'errors' => ['Unauthorized access. Please contact your company administrator.'],
            ], 201);
        }

        $expertises = $this->fetchExpertise();
        $experiences = $this->fetchExperience($worker->company_id);
        $work_areas = $this->fetchWorkAreas();

        $token = $worker->createToken('access_token')->plainTextToken;
        $response = [
            'token' => $token,
            'refresh_token' => $token,
            'expertises' => $expertises,
            'experiences' => $experiences,
            'work_areas' => $work_areas,
        ];

        return response($response, 201);
    }

    public function fetchExpertise()
    {
        return Expertise::select(
            'expertises.id',
            'expertises.name')
            ->orderBy('name', 'asc')
            ->get();
    }

    public function fetchExperience($company_id)
    {
        return CompanyExperience::select(
            'id',
            'name')
            ->where('company_id', $company_id)
            ->orderBy('name', 'asc')
            ->get();
    }

    public function fetchWorkAreas()
    {
        return WorkAreas::select(
            'work_areas.id',
            'work_areas.name')
            ->orderBy('name', 'asc')
            ->get();
    }
}
