<?php

namespace App\Observers;

use App\Models\User;
use Illuminate\Support\Facades\Log;

class UserObserver
{
    /**
     * Handle the User "creating" event.
     */
    public function creating(User $user): void
    {
        Log::channel('user')->info('User creating ...', [
            request()->except(['password', 'password_confirmation']),
        ]);

        // concatenation name with firstname and lastname on request
        $user->name = request()->firstname.' '.request()->lastname;
    }

    /**
     * Handle the User "created" event.
     */
    public function created(User $user): void
    {
        $dirty = collect($user->getDirty())->except(['remember_token', 'password'])->toArray();

        Log::channel('user')->info("User created: #{$user->id}", [
            $dirty,
            // $user->profile->getDirty(),
        ]);
    }

    /**
     * Handle the User "updated" event.
     */
    public function updated(User $user): void
    {
        $dirty = collect($user->getDirty())->except(['remember_token'])->toArray();

        Log::channel('user')->info("User updated: #{$user->id}", [
            $dirty,
            $user->profile?->getDirty(),
        ]);

        // concatenation name with firstname and lastname on request
        // The profile is absent when the user is updated outside an HTTP request
        // (Stripe webhook syncing user_plan, console commands): leave the name as is.
        if ($user->profile) {
            $user->name = $user->profile->firstname.' '.$user->profile->lastname;
        }
    }

    /**
     * Handle the User "deleted" event.
     */
    public function deleted(User $user): void
    {
        Log::channel('user')->info("User deleted: #{$user->id}");

        // delete office
        // $user->office()->delete();
    }

    /**
     * Handle the User "restored" event.
     */
    public function restored(User $user): void
    {
        Log::channel('user')->info("User restored: #{$user->id}");
    }

    /**
     * Handle the User "force deleted" event.
     */
    public function forceDeleted(User $user): void
    {
        Log::channel('user')->info("User force deleted: #{$user->id}");
    }
}
