<?php

namespace App\Livewire\Admin\User;

use App\Models\Admin\User;
use Livewire\Component;
use Livewire\Attributes\On;
use Livewire\Attributes\Url;
use Livewire\WithPagination;
use Illuminate\Support\Facades\Auth;

class ShowUsers extends Component
{
    use WithPagination;

    #[Url(as: 'q')]
    public $search = '';

    public function updatingSearch()
    {
        $this->resetPage();
    }

    public function changeStatus($id)
    {
        $user = User::find($id);

        if(Auth::id() == $user->id) {
            $this->dispatch('showAlert', [
                'title' => 'Uyarı!', 'text' => 'Kendi durumunuzu değiştiremezsiniz.', 'icon' => 'warning'
            ]);
            $this->dispatch('resetSwitch', id: $id);
            return;
        }

        if ($user->hasRole('admin')) {
            if (!Auth::user()->hasAnyRole(['admin', 'super-admin'])) {
                $this->dispatch('showAlert', [
                    'title' => 'Uyarı!', 'text' => 'Bu role sahip kullanıcıların durumu değiştirilemez.', 'icon' => 'warning'
                ]);
                $this->dispatch('resetSwitch', id: $id);
                return;
            }
        }

        $user->admin_approval = !$user->admin_approval;
        $user->save();

        activity()->performedOn($user)->causedBy(auth()->id())->log('Kullanıcı durumu güncellendi');

        $this->dispatch('showAlert', [
            'title' => 'Başarılı!', 'text' => 'Kullanıcı admin onay durumu başarıyla değiştirildi.', 'icon' => 'success'
        ]);
    }

    public function deleteConfirm($id)
    {
        $user = User::find($id);

        if(Auth::id() == $user->id) {
            return $this->dispatch('showAlert', [
                'title' => 'Uyarı!', 'text' => 'Kendi kullanıcınızı silemezsiniz.', 'icon' => 'warning'
            ]);
        }

        if ($user->hasRole('admin')) {
            if (!Auth::user()->hasAnyRole(['admin', 'super-admin'])) {
                return $this->dispatch('showAlert', [
                    'title' => 'Uyarı!', 'text' => 'Bu role sahip kullanıcıları silemezsiniz.', 'icon' => 'warning'
                ]);
            }
        }

        $this->dispatch('deleteTriggered', id: $id);
    }

    #[On('deleteUser')]
    public function delete($id)
    {
        $user = User::find($id);

        $user->delete();

        activity()->performedOn($user)->causedBy(auth()->id())->log('Kullanıcı silindi');

        $this->dispatch('showAlert', [
            'title' => 'Başarılı!', 'text' => 'Kullanıcı başarıyla silindi.', 'icon' => 'success'
        ]);
    }

    public function render()
    {
        $query = User::query();

        if (!auth()->user()->hasRole('super-admin')) {
            $query->whereDoesntHave('roles', function ($roleQuery) {
                $roleQuery->where('name', 'super-admin');
            });
        }

        $users = $query->search($this->search)->orderByDesc('created_at')->paginate(10);

        return view('livewire.admin.user.show-users', [
            'users' => $users
        ]);
    }
}