<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class EmailSubscriber extends Model
{
    use HasFactory, SoftDeletes;

    protected $fillable = [
        'email',
        'subscribed_at',
    ];

    protected $casts = [
        'subscribed_at' => 'datetime',
    ];

    // Scope for active subscribers
    public function scopeActive($query)
    {
        return $query->whereNull('deleted_at');
    }

    // Check if email is subscribed
    public static function isSubscribed(string $email): bool
    {
        return static::where('email', $email)->active()->exists();
    }

    // Subscribe email
    public static function subscribe(string $email): bool
    {
        if (static::isSubscribed($email)) {
            return false; // Already subscribed
        }

        // Check if email was previously unsubscribed and restore it
        $subscriber = static::withTrashed()->where('email', $email)->first();

        if ($subscriber) {
            $subscriber->restore();
            $subscriber->update(['subscribed_at' => now()]);
        } else {
            static::create([
                'email'         => $email,
                'subscribed_at' => now(),
            ]);
        }

        return true;
    }

    // Unsubscribe email (soft delete)
    public static function unsubscribe(string $email): bool
    {
        $subscriber = static::where('email', $email)->first();

        if ($subscriber) {
            $subscriber->delete();

            return true;
        }

        return false;
    }

    // Get subscription duration
    public function getSubscriptionDurationAttribute(): int
    {
        return $this->subscribed_at->diffInDays(now());
    }

    protected static function boot()
    {
        parent::boot();

        static::creating(function ($subscriber) {
            if (empty($subscriber->subscribed_at)) {
                $subscriber->subscribed_at = now();
            }
        });
    }
}
