<?php

namespace App\Livewire\Maintenance;

use App\Models\Host;
use Livewire\Component;
use App\Models\Maintenance;
use App\Models\MaintenanceTask;
use App\Models\Task;

class Form extends Component
{
    public $model;
    public string $name = "";
    public string $description = "";
    public string $schedule = "";

    public $action = 'store';

    public $hosts = [];
    public $hosts_available = [];

    public $hosts_tasks = [];
    public $hosts_tasks_available = [];

    protected function rules()
    {
        return [
            'name' => 'required',
            'description' => 'required',
            'schedule' => 'required',
        ];
    }

    public function mount($model = null)
    {
        $this->hosts_available = Host::all()->pluck('hostname', 'id')->toArray();
        $this->hosts_tasks_available = Task::all()->pluck('name', 'id')->toArray();

        if (!empty($model)) {
            $maintenance = Maintenance::find($model);

            $this->model = $model;

            $this->name = $maintenance->name;
            $this->description = $maintenance->description;
            $this->schedule = $maintenance->schedule;

            $this->hosts = $maintenance->hosts()->pluck('hosts.id')->toArray();
            foreach ($maintenance->tasks as $task) {
                $this->hosts_tasks[$task->host_id][] = $task->task_id;
            }

            $this->action = 'update';
        }
    }

    public function updatedHosts($value)
    {
        foreach ($this->hosts_tasks as $host_id => $tasks) {
            if (in_array($host_id, $this->hosts)) {
                continue;
            }

            unset($this->hosts_tasks[$host_id]);
        }
    }

    public function store()
    {
        $validatedData = $this->validate();
        $maintenance = Maintenance::create($validatedData);
        $hosts = Host::whereIn('id', $this->hosts)->get();
        foreach ($hosts as $key => $host) {
            $maintenance->hosts()->attach($host);
            $tasks =  Task::whereIn('id', $this->hosts_tasks[$host->id])->get();
            foreach ($tasks as $task) {
                $maintenance->tasks()->create([
                    'task_id' => $task->id,
                    'host_id' => $host->id,
                ]);
            }
        }
        $this->dispatch('closeModal');
    }

    public function update()
    {
        $validatedData = $this->validate();
        $maintenance = Maintenance::find($this->model);
        $maintenance->hosts()->whereNotIn('host_id', $this->hosts)->delete();

        if (!empty($maintenance)) {
            $maintenance->update($validatedData);
            $hosts = Host::whereIn('id', $this->hosts)->whereNotIn('id', $maintenance->hosts()->pluck('hosts.id')->toArray())->get();
            foreach ($hosts as $key => $host) {
                $maintenance->hosts()->attach($host);
            }
            $maintenance->refresh();

            foreach ($maintenance->hosts as $host) {
                $alreadyUsedHosts = $maintenance->tasks()->where('host_id', $host->id)->distinct('maintenance_tasks.task_id')->pluck('maintenance_tasks.task_id')->toArray();
                $tasks = Task::whereIn('id', $this->hosts_tasks[$host->id])->whereNotIn('id', $alreadyUsedHosts)->get();
                foreach ($tasks as $key => $task) {
                    $maintenance->tasks()->create([
                        'task_id' => $task->id,
                        'host_id' => $host->id,
                    ]);
                }
            }
        }

        $this->dispatch('closeModal');
    }

    public function render()
    {
        return view('livewire.maintenance.form');
    }

    public function addHost()
    {
        $this->hosts[] = [];
    }

    public function removeHost($id)
    {
        unset($this->hosts[$id]);
    }
}