<?php

namespace App\Models;

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

class UserInteraction extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'session_id',
        'item_id',
        'interaction_type',
        'metadata',
    ];

    protected function casts(): array
    {
        return [
            'metadata' => 'array',
        ];
    }

    const UPDATED_AT = null; // Disable updated_at

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function item()
    {
        return $this->belongsTo(Item::class);
    }

    public static function track($itemId, $interactionType, $metadata = [])
    {
        $userId = auth()->check() ? auth()->id() : null;
        $sessionId = session()->getId();

        // Avoid duplicate tracking for the same item within a short time
        $recentInteraction = self::where('item_id', $itemId)
            ->where('interaction_type', $interactionType)
            ->where(function($query) use ($userId, $sessionId) {
                if ($userId) {
                    $query->where('user_id', $userId);
                } else {
                    $query->where('session_id', $sessionId);
                }
            })
            ->where('created_at', '>', now()->subMinutes(5))
            ->first();

        if (!$recentInteraction) {
            self::create([
                'user_id' => $userId,
                'session_id' => $sessionId,
                'item_id' => $itemId,
                'interaction_type' => $interactionType,
                'metadata' => $metadata,
            ]);
        }
    }

    public static function getUserCategoryInterests($userId, $days = 30)
    {
        $interactions = self::join('items', 'user_interactions.item_id', '=', 'items.id')
            ->where('user_interactions.user_id', $userId)
            ->where('user_interactions.created_at', '>', now()->subDays($days))
            ->selectRaw('items.category_id, COUNT(*) as interaction_count')
            ->groupBy('items.category_id')
            ->orderByDesc('interaction_count')
            ->get();

        return $interactions->pluck('interaction_count', 'category_id')->toArray();
    }

    public static function getUserPriceInterests($userId, $days = 30)
    {
        return self::join('items', 'user_interactions.item_id', '=', 'items.id')
            ->where('user_interactions.user_id', $userId)
            ->where('user_interactions.created_at', '>', now()->subDays($days))
            ->whereNotNull('items.price')
            ->avg('items.price');
    }
}