<?php

namespace App\Http\Requests;

use App\Http\Controllers\Admin\UserManageTrait;
use App\Libs\Security\XSSCleanFilter;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Waavi\Sanitizer\Laravel\SanitizesInput;

class BackendUserStore extends FormRequest
{
    use SanitizesInput;
    use UserManageTrait;

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return $this->_canManage() || $this->_canEdit($this->route('userId'));
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = [];
        $canManage = $this->_canManage();
        $userId = $this->route('userId');

        if ($canManage) {
            $rules = array_merge($rules, [
                'first_name' => 'required|max:50',
                'last_name' => 'required|max:50',
                'location' => 'max:100',
                'contact_1' => 'max:40',
                'contact_2' => 'max:40',
                'role' => 'max:50',
                'type_id' => 'integer|exists:backend_user_types,id',
                'user_permissions' => 'array',
                'user_permissions.*' => 'integer'
            ]);
        }

        if (!empty($userId)) {
            $rules['username'] = [
                'required',
                'alpha_num',
                'max:20',
                Rule::unique('backend_users', 'username')->ignore($userId)
            ];

            if ($canManage) {
                $rules['email'] = [
                    'required',
                    'max:100',
                    'email',
                    Rule::unique('backend_users', 'email')->ignore($userId)
                ];
            }
            if ($this->filled('password')) {
                $rules['password'] = 'required|alpha_num|min:6|max:12|confirmed';
            }

        } else {
            $rules['username'] = 'required|alpha_num|max:20|unique:backend_users';
            $rules['email'] = 'required|max:100|email|unique:backend_users';
            $rules['password'] = 'required|'.config('auth.password_validation_rule').'|confirmed';
        }

        return $rules;
    }

    /**
     * Get the error messages for the defined validation rules.
     *
     * @return array
     */
    public function messages()
    {
        return [
            "type_id" => "type",
            "contact_1" => "contact 1",
            "contact_2" => "contact 2"
        ];
    }

    /**
     * Filters to be applied to the input.
     *
     * @return array
     */
    public function filters()
    {
        return [
            'first_name' => "trim|strip_tags|xss_clean",
            'last_name' => "trim|strip_tags|xss_clean",
            'location' => "trim|strip_tags|xss_clean",
            'contact_1' => "trim|strip_tags|xss_clean",
            'contact_2' => "trim|strip_tags|xss_clean",
            'role' => "trim|strip_tags|xss_clean",
        ];
    }

    public function customFilters()
    {
        return ['xss_clean' => XSSCleanFilter::class];
    }
}
