<?php

namespace App\Http\Livewire;

use App\Models\Plan;
use Livewire\Component;
use Livewire\WithPagination;
use App\Traits\OrderByTable;

class PlansController extends Component
{
    use WithPagination;
    use OrderByTable;

    public $name, $description, $price, $color, $max_users_administrators, $max_users_administrative, $max_users_employees;
    public $search, $selected_id, $pageTitle, $componentName, $count_reg;
    public $breadcrumb_show = true;

    private $pagination = 10;

    public function mount()
    {
        UserAuthPermission('Plan_index');
        $this->pageTitle = 'Listado';
        $this->componentName = 'Planes';
    }


    public function render()
    {
        if (strlen($this->search) > 0)
            $plans = Plan::where('name', 'like', '%' . $this->search. '%')->orderBy($this->sortBy, $this->sortDirection)->paginate($this->pagination);
        else
            $plans = Plan::orderBy($this->sortBy, $this->sortDirection)->paginate($this->pagination);


        return view('livewire.plans.component',compact('plans'))
        ->extends('layouts.theme.admin.app')
        ->section('content');
    }

    public function openAdd()
    {
        $useractions = UserAuthPermissionActions('Plan_create');
        if (!empty($useractions)){
            $this->emit($useractions[0],$useractions[1]);
            return false;
        }
        $this->selected_id = 0;
        $this->resetUI();
        $this->emit('show-modal','Abrir Modal');
    }


    public function Edit(Plan $plan)
    {
        $useractions = UserAuthPermissionActions('Plan_update');
        if (!empty($useractions)){
            $this->emit($useractions[0],$useractions[1]);
            return false;
        }
        $this->selected_id = $plan->id;
        $this->name = $plan->name;
        $this->description = $plan->description;
        $this->price = $plan->price;
        $this->color = $plan->color;
        $this->max_users_administrators = $plan->max_users_administrators;
        $this->max_users_administrative = $plan->max_users_administrative;
        $this->max_users_employees = $plan->max_users_employees;
        $this->emit('show-modal', 'Abrir Modal');
    }



    public function Store()
    {
        $useractions = UserAuthPermissionActions('Plan_create');
        if (!empty($useractions)){
            $this->emit($useractions[0],$useractions[1]);
            return false;
        }
        $rules = [
            'name' => 'required|min:3|max:49|unique:plans,name',
            'description' => 'required|min:3|max:254',
            'price' => 'required|max:99999999',
            'color' => 'required',
            'max_users_administrators' => 'required|max:99',
            'max_users_administrative' => 'required|max:999',
            'max_users_employees' => 'required|max:999999999',
        ];

        $messages = [
            'name.required' => 'Ingresa el Nombre',
            'name.min' => 'El Nombre debe tener como mínimo 3 caracteres',
            'name.max' => 'El Nombre debe tener como máximo 49 caracteres',
            'name.unique' => 'El Nombre ya existe',
            'description.required' => 'Ingrese la Descripción',
            'description.min' => 'La Descripción debe tener como mínimo 3 caracteres',
            'description.max' => 'La Descripción debe tener como máximo 254 caracteres',
            'price.required' => 'Ingrese el Precio',
            'price.max' => 'El Precio debe tener como máximo 99999999',
            'color.required' => 'Seleccione el Color',
            'max_users_administrators.required' => 'Ingrese el Número Máximo de Usuarios Administradores',
            'max_users_administrators.max' => 'El Número Máximo de Usuarios Administradores debe tener como máximo 99',
            'max_users_administrative.required' => 'Ingrese el Número Máximo de Usuarios Administrativos',
            'max_users_administrative.max' => 'El Número Máximo de Usuarios Administrativos debe tener como máximo 999',
            'max_users_employees.required' => 'Ingrese el Número Máximo de Usuarios Empleados',
            'max_users_employees.max' => 'El Número Máximo de Usuarios Empleados debe tener como máximo 999999999',
        ];

        debug('antes de validar');

        $this->validate($rules, $messages);

        debug('antes de guardar');

        Plan::create([
            'name' => $this->name,
            'description' => $this->description,
            'price' => (float)$this->price,
            'color' => $this->color,
            'max_users_administrators' => $this->max_users_administrators,
            'max_users_administrative' => $this->max_users_administrative,
            'max_users_employees' => $this->max_users_employees,
        ]);
        debug('guardado');
        $this->resetUI();
        $this->emit('item-added', 'Plan registrado correctamente');

    }

    public function Update()
    {
        $useractions = UserAuthPermissionActions('Plan_update');
        if (!empty($useractions)){
            $this->emit($useractions[0],$useractions[1]);
            return false;
        }
        $rules = [
            'name' => 'required|min:3|max:49|unique:plans,name,' . $this->selected_id,
            'description' => 'required|min:3|max:254',
            'price' => 'required|max:99999999',
            'color' => 'required',
            'max_users_administrators' => 'required|max:99',
            'max_users_administrative' => 'required|max:999',
            'max_users_employees' => 'required|max:999999999',
        ];
        $messages = [
            'name.required' => 'Ingresa el Nombre',
            'name.min' => 'El Nombre debe tener como mínimo 3 caracteres',
            'name.unique' => 'El Nombre ya existe',
            'name.max' => 'El Nombre debe tener como máximo 49 caracteres',
            'description.required' => 'Ingrese la Descripción',
            'description.min' => 'La Descripción debe tener como mínimo 3 caracteres',
            'description.max' => 'La Descripción debe tener como máximo 254 caracteres',
            'price.required' => 'Ingrese el Precio',
            'price.max' => 'El Precio debe tener como máximo 99999999',
            'color.required' => 'Seleccione el Color',
            'max_users_administrators.required' => 'Ingrese el Número Máximo de Usuarios Administradores',
            'max_users_administrators.max' => 'El Número Máximo de Usuarios Administradores debe tener como máximo 99',
            'max_users_administrative.required' => 'Ingrese el Número Máximo de Usuarios Administrativos',
            'max_users_administrative.max' => 'El Número Máximo de Usuarios Administrativos debe tener como máximo 999',
            'max_users_employees.required' => 'Ingrese el Número Máximo de Usuarios Empleados',
            'max_users_employees.max' => 'El Número Máximo de Usuarios Empleados debe tener como máximo 999999999',
        ];

        $this->validate($rules, $messages);

        $plan = Plan::find($this->selected_id);

        $plan->update([
            'name' => $this->name,
            'description' => $this->description,
            'price' => (float) str_replace(',', '', $this->price),
            'color' => $this->color,
            'max_users_administrators' => $this->max_users_administrators,
            'max_users_administrative' => $this->max_users_administrative,
            'max_users_employees' => $this->max_users_employees,
        ]);

        $this->resetUI();
        $this->emit('item-updated', 'Plan actualizado correctamente');
    }

    protected $listeners = ['deleteRow' => 'Destroy'];

    public function Destroy($id)
    {
        $useractions = UserAuthPermissionActions('Plan_delete');
        if (!empty($useractions)){
            $this->emit($useractions[0],$useractions[1]);
            return false;
        }
        $companiesCount = Plan::find($id)->companies()->count();
        if($companiesCount > 0)
        {
            $this->emit('item-error', 'No se puede eliminar el Plan, tiene empresas asociadas');
            return;
        }

        Plan::find($id)->delete();
        $this->emit('item-deleted', 'Se eliminó el Plan correctamente');
    }

    public function resetUI()
    {
        $this->name = '';
        $this->description = '';
        $this->price = '';
        $this->color = '';
        $this->max_users_administrators = '';
        $this->max_users_administrative = '';
        $this->max_users_employees = '';
        $this->resetValidation();
        $this->resetPage();
    }

}
