<?php

namespace App\Livewire\Assegnazioni;

use Livewire\Component;
use App\Models\Assegnazione;
use App\Models\Campagna;

class Rientra extends Component
{
    public Assegnazione $assegnazione;
    public string $returned_at = '';
    public bool $showCampaignPrompt = false;
    public ?int $campagna_id = null;
    public bool $counted_in_campaign = false;

    public function mount(Assegnazione $assegnazione)
    {
        $this->assegnazione = $assegnazione->load(['territorio', 'proclamatore']);

        if ($assegnazione->returned_at) {
            abort(404, 'Assegnazione già rientrata.');
        }

        $this->returned_at = now()->format('Y-m-d');
        $this->checkCampaign();
    }

    public function updatedReturnedAt()
    {
        $this->checkCampaign();
    }

    protected function checkCampaign()
    {
        if (!$this->returned_at) {
            $this->showCampaignPrompt = false;
            return;
        }

        $returnDate = \Carbon\Carbon::parse($this->returned_at);
        $campagna = $this->assegnazione->campagnaApplicabile($returnDate);

        if ($campagna) {
            $this->showCampaignPrompt = true;
            $this->campagna_id = $campagna->id;
        } else {
            $this->showCampaignPrompt = false;
            $this->campagna_id = null;
            $this->counted_in_campaign = false;
        }
    }

    protected function rules(): array
    {
        return [
            'returned_at' => 'required|date|after_or_equal:' . $this->assegnazione->assigned_at->format('Y-m-d') . '|before_or_equal:today',
        ];
    }

    public function save()
    {
        $this->validate();

        $returnDate = \Carbon\Carbon::parse($this->returned_at);

        $this->assegnazione->update([
            'returned_at' => $returnDate,
            'returned_by' => auth()->id(),
            'campaign_id' => $this->counted_in_campaign ? $this->campagna_id : null,
            'counted_in_campaign' => $this->counted_in_campaign,
        ]);

        $territorio = $this->assegnazione->territorio;
        $proclamatore = $this->assegnazione->proclamatore;

        activity()->causedBy(auth()->user())
            ->performedOn($this->assegnazione)
            ->withProperties([
                'territorio' => $territorio->numero,
                'proclamatore' => $proclamatore->nome_completo,
                'giorni' => $this->assegnazione->giorni,
                'campagna' => $this->counted_in_campaign,
            ])
            ->log('returned');

        session()->flash('success', "Territorio {$territorio->numero} rientrato da {$proclamatore->nome_completo} dopo {$this->assegnazione->giorni} giorni.");
        return $this->redirect(route('territori.show', $territorio), navigate: true);
    }

    public function render()
    {
        $campagna = $this->campagna_id ? Campagna::find($this->campagna_id) : null;

        return view('livewire.assegnazioni.rientra', [
            'campagna' => $campagna,
        ]);
    }
}
