<?php

use App\Models\AnnexOthersContractUser;
use App\Models\Contract;
use App\Models\DocumentType;
use App\Models\HistoryContractsUser;
use App\Models\JobPosition;
use App\Models\TypePsychotechnicsTest;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Spatie\Permission\Models\Role;

if(! function_exists('roles_user')){
    function roles_user($not_required = null){

        $roles = Role::query()->select('id', 'name')->orderBy('id', 'asc')->get()->toArray(); // convertimos la colección a array
        $roles = array_column($roles, 'name'); // obtenemos solo el nombre de cada rol
        //remove item value 'Soporte' from array
        //unset($roles_company[array_search('Soporte', $roles_company)]);
        //removemos el item con valor 'Super Admin' del array
        //unset($roles_company[array_search('Super Admin', $roles_company)]);

        if ($not_required == null){
            return $roles;
        }
        else{
            if (count($not_required) > 0){
                foreach ($not_required as $not_required_role){
                    if (in_array($not_required_role, $roles)){
                        unset($roles[array_search($not_required_role, $roles)]);
                    }
                }
            }

            return $roles;
        }

    }
}

if(! function_exists('UserAuthPermission')){
	function UserAuthPermission($permission)
    {
        $roles_company = roles_user(['Super Admin', 'Soporte']);

        $userAuth = Auth::user();
        if ( $userAuth->hasAnyRole($roles_company))
        {
            if ($userAuth->companies()->count() == 0)
                {
                    abort(403, 'Tu usuario no tiene una empresa asignada, contacta al administrador.');
                }
        }
        if (!$userAuth->hasPermissionTo($permission))
        {
            redirect()->route('dashboard')->with('error', 'No tienes permiso para acceder a este módulo.');
            abort(403, 'No tienes permiso para acceder a este módulo.');//generamos un error 403 si la redireccion no se hace
        }
    }
}

if(! function_exists('UserAuthPermissionActions'))
{
	function UserAuthPermissionActions($permission)
    {
        $userAuth = Auth::user();
        if (!$userAuth->hasPermissionTo($permission)) {
            return array('not-permission','No tiene permisos para realizar esta acción');
        }
    }
}

if (! function_exists('UsersIdExists'))
{
    function UsersIdExists($id)
    {
        $user = User::find($id);
        if (!$user)
        {
            redirect()->route('dashboard')->with('error', 'El usuario no existe.');
            abort(403, 'El usuario no existe.');
        }
    }
}


if (! function_exists('EmployeeOtherCompany')) {

    function EmployeeOtherCompany($employee_id, $action = false, $controller = false, $role="Empleado")
    {
        $roles_company = roles_user(['Super Admin', 'Soporte']);
        $userAuth = Auth::user();
        if ( $userAuth->hasAnyRole($roles_company))
        {
            $user = User::find($employee_id);
            $role = $user->getRoleNames()[0];
            if ($userAuth->hasRole('Empleado'))
            {
                $employee_id = $userAuth->id; // Si es empleado solo se puede ver su propia información
            }
            $company_id= Auth::user()->CompanyId();
            $employee = User::role($role)
                            ->join('company_user', 'users.id', '=', 'company_user.user_id')
                            ->join('companies', 'company_user.company_id', '=', 'companies.id')
                            ->where('companies.id', $company_id)
                            ->where('users.id', $employee_id)
                            ->select('users.*','companies.name as company_name')
                            ->first();
            if ($employee == null)
            {
                if ($controller == true){
                    return false;
                }
                if ($action == true){// Si es true, se muestra un mensaje de error, aplica para todas las acciones (store, update, delete)
                    if ($userAuth->hasRole('Empleado'))
                        return array(NULL,'No puede realizar esta acción, no es su cuenta.');
                    else
                        return array(NULL,'No puede realizar esta acción, este empleado no pertenece a su empresa.');
                }
                else{
                    if ($userAuth->hasRole('Empleado'))
                        redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, no es su cuenta.');
                    else{
                        redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, este empleado no pertenece a su empresa.');
                        //abort(403, 'No puede realizar esta acción, este empleado no pertenece a su empresa.');//generamos un error 403 si la redireccion no se hace
                    }
                }
            }
            else{
                return array(true, NULL);
            }
        }
        return array(true, NULL);
    }
}

if (! function_exists('ContractNotCompany')) {

    function ContractNotCompany($contract_id, $company_id, $company_plan_id, $action=false, $controller=false)
    {
        $roles_company = roles_user(['Super Admin', 'Soporte']);
        $userAuth = Auth::user();
        if ( $userAuth->hasAnyRole($roles_company))
        {
            $contract = Contract::select('contracts.*')
            ->join('contract_plans', 'contract_plans.contract_id', '=', 'contracts.id')
            ->join('plans', 'contract_plans.plan_id', '=', 'plans.id')
            ->where('contract_plans.plan_id', $company_plan_id)
            ->where('contracts.status', 'Activo')
            ->where('contracts.id', $contract_id)
            ->union(
                Contract::select('contracts.*')
                ->join('contract_companies', 'contract_companies.contract_id', '=', 'contracts.id')
                ->join('companies', 'contract_companies.company_id', '=', 'companies.id')
                ->where('contract_companies.company_id', $company_id)
                ->where('contracts.status', 'Activo')
                ->where('contracts.id', $contract_id)
            )
            ->first();
            if ($contract == null)
            {
                if ($controller == true){
                    return false;
                }
                if ($action == true){// Si es true, se muestra un mensaje de error, aplica para todas las acciones (store, update, delete)
                    if ($userAuth->hasRole('Empleado'))
                        return array(NULL,'No puede realizar esta acción, no cuenta con este contrato.');
                    else
                        return array(NULL,'No puede realizar esta acción, este contrato no pertenece a su empresa.');
                }
                else{
                    if ($userAuth->hasRole('Empleado'))
                        redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, no cuenta con este contrato.');
                    else
                        redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, este contrato no pertenece a su empresa.');
                }
            }
            else{
                return array(true, NULL);
            }
        }
        return array(true, NULL);
    }
}

if (! function_exists('ContractUserOtherCompany')) {

    function ContractUserOtherCompany($contract_id, $company_id, $action=false, $controller=false)
    {
        $roles_company = roles_user(['Super Admin', 'Soporte']);
        $userAuth = Auth::user();
        if ( $userAuth->hasAnyRole($roles_company))
        {
            $contract_user = HistoryContractsUser::where('id', $contract_id)
                            ->where('company_id', $company_id)
                            ->first();

            if ($contract_user == null)
            {
                if ($controller == true){
                    return false;
                }
                if ($action == true){// Si es true, se muestra un mensaje de error, aplica para todas las acciones (store, update, delete)
                    if ($userAuth->hasRole('Empleado'))
                        return array(NULL,'No puede realizar esta acción, no cuenta con este contrato.');
                    else
                        return array(NULL,'No puede realizar esta acción, este contrato no pertenece a su empresa.');
                }
                else{
                    if ($userAuth->hasRole('Empleado'))
                        redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, no cuenta con este contrato.');
                    else
                        redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, este contrato no pertenece a su empresa.');
                }
            }
            else{
                return array(true);
            }
        }
        return array(true);
    }
}

if (! function_exists('AnnexUserOtherCompany')){
    function AnnexUserOtherCompany($annex_id, $company_id, $action=false, $controller=false)
    {
        $roles_company = roles_user(['Super Admin', 'Soporte']);
        $userAuth = Auth::user();
        if ( $userAuth->hasAnyRole($roles_company))
        {
            $annex_user = AnnexOthersContractUser::where('id', $annex_id)
                            ->where('company_id', $company_id)
                            ->first();

            if ($annex_user == null)
            {
                if ($controller == true){
                    return false;
                }
                if ($action == true){// Si es true, se muestra un mensaje de error, aplica para todas las acciones (store, update, delete)
                    if ($userAuth->hasRole('Empleado'))
                        return array(NULL,'No puede realizar esta acción, no cuenta con este anexo.');
                    else
                        return array(NULL,'No puede realizar esta acción, este anexo no pertenece a su empresa.');
                }
                else{
                    if ($userAuth->hasRole('Empleado'))
                        redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, no cuenta con este anexo.');
                    else
                        redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, este anexo no pertenece a su empresa.');
                }
            }
            else{
                return array(true);
            }
        }
        return array(true);
    }
}


if (! function_exists('JobPositionNotCompany')) {

    function JobPositionNotCompany($job_position_id, $company_id, $action=false)
    {
        $roles_company = roles_user(['Super Admin', 'Soporte','Empleado']);
        $userAuth = Auth::user();
        if ( $userAuth->hasAnyRole($roles_company))
        {
            $job_position = JobPosition::where('id', $job_position_id)
            ->where('company_id', $company_id)
            ->first();

            if ($job_position == null)
            {
                if ($action == true){// Si es true, se muestra un mensaje de error, aplica para todas las acciones (store, update, delete)
                    return array(NULL,'No puede realizar esta acción, este puesto no pertenece a su empresa.');
                }
                else{
                    redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, este puesto no pertenece a su empresa.');
                }
            }
            else{
                return array(true, NULL);
            }
        }
        else{
            return array(true, NULL);
        }
    }
}

if (! function_exists('TypePsychotechnicsTestNotCompany')) {

    function TypePsychotechnicsTestNotCompany($type_psychotechnics_test_id, $company_id, $action=false)
    {
        $roles_company = roles_user(['Super Admin', 'Soporte','Empleado']);
        $userAuth = Auth::user();
        if ( $userAuth->hasAnyRole($roles_company))
        {
            $type_psychotechnics_test = TypePsychotechnicsTest::where('id', $type_psychotechnics_test_id)
            ->where('company_id', $company_id)
            ->first();

            if ($type_psychotechnics_test == null)
            {
                if ($action == true){// Si es true, se muestra un mensaje de error, aplica para todas las acciones (store, update, delete)
                    return array(NULL,'No puede realizar esta acción, este tipo de prueba no pertenece a su empresa.');
                }
                else{
                    redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, este tipo de prueba no pertenece a su empresa.');
                }
            }
            else{
                return array(true, NULL);
            }
        }
        else{
            return array(true, NULL);
        }
    }
}

if (! function_exists('DocumentTypeNotCompany')) {

    function DocumentTypeNotCompany($document_type_id, $company_id, $action=false)
    {
        $roles_company = roles_user(['Super Admin', 'Soporte','Empleado']);
        $userAuth = Auth::user();
        if ( $userAuth->hasAnyRole($roles_company))
        {
            $document_type = DocumentType::where('id', $document_type_id)
            ->where('company_id', $company_id)
            ->first();

            if ($document_type == null)
            {
                if ($action == true){// Si es true, se muestra un mensaje de error, aplica para todas las acciones (store, update, delete)
                    return array(NULL,'No puede realizar esta acción, este tipo de documento no pertenece a su empresa.');
                }
                else{
                    redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, este tipo de documento no pertenece a su empresa.');
                }
            }
            else{
                return array(true, NULL);
            }
        }
        else{
            return array(true, NULL);
        }
    }
}

if (! function_exists('ItemNotCompany')){

        function ItemNotCompany($item_id, $company_id, $table, $action=false)
        {
            $roles_company = roles_user(['Super Admin', 'Soporte','Empleado']);
            $userAuth = Auth::user();
            if ( $userAuth->hasAnyRole($roles_company))
            {

                $item = DB::table($table)->where('id', $item_id)
                ->where('company_id', $company_id)
                ->first();
                if ($item == null)
                {
                    if ($action == true){// Si es true, se muestra un mensaje de error, aplica para todas las acciones (store, update, delete)
                        return array(NULL,'No puede realizar esta acción, este item no pertenece a su empresa.');
                    }
                    else{
                        redirect()->route('dashboard')->with('error', 'No puede realizar esta acción, este item no pertenece a su empresa.');
                    }
                }
                else{
                    return array(true, NULL);
                }
            }
            else{
                return array(true, NULL);
            }
        }
}

if (! function_exists('InfoNotEmployee')){

        function InfoNotEmployee($id_employee)
        {
            $userAuth = Auth::user();
            if ($userAuth->hasRole('Empleado'))
            {
                if ($userAuth->id != $id_employee)
                {
                    return true;
                }
                else{
                    return false;
                }
            }
            else{
                return false;
            }
        }
}
