<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\UserInteraction;
use App\Models\Item;
use App\Models\Category;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class AnalyticsController extends Controller
{
    public function index(Request $request)
    {
        $days = $request->get('days', 30);
        
        // Overall stats
        $totalInteractions = UserInteraction::where('created_at', '>', now()->subDays($days))->count();
        $uniqueUsers = UserInteraction::where('created_at', '>', now()->subDays($days))
            ->whereNotNull('user_id')
            ->distinct('user_id')
            ->count();
        $uniqueSessions = UserInteraction::where('created_at', '>', now()->subDays($days))
            ->whereNull('user_id')
            ->distinct('session_id')
            ->count();
        
        // Interaction type breakdown
        $interactionTypes = UserInteraction::where('created_at', '>', now()->subDays($days))
            ->select('interaction_type', DB::raw('COUNT(*) as count'))
            ->groupBy('interaction_type')
            ->orderByDesc('count')
            ->get();

        // Most popular categories
        $popularCategories = UserInteraction::join('items', 'user_interactions.item_id', '=', 'items.id')
            ->join('categories', 'items.category_id', '=', 'categories.id')
            ->where('user_interactions.created_at', '>', now()->subDays($days))
            ->select('categories.name', DB::raw('COUNT(*) as interaction_count'))
            ->groupBy('categories.id', 'categories.name')
            ->orderByDesc('interaction_count')
            ->limit(10)
            ->get();

        // Most viewed items
        $popularItems = UserInteraction::join('items', 'user_interactions.item_id', '=', 'items.id')
            ->where('user_interactions.created_at', '>', now()->subDays($days))
            ->where('user_interactions.interaction_type', 'view')
            ->select('items.id', 'items.title', 'items.price', DB::raw('COUNT(*) as view_count'))
            ->groupBy('items.id', 'items.title', 'items.price')
            ->orderByDesc('view_count')
            ->limit(10)
            ->get();

        // Daily interaction trends
        $dailyTrends = UserInteraction::where('created_at', '>', now()->subDays($days))
            ->select(
                DB::raw('DATE(created_at) as date'),
                'interaction_type',
                DB::raw('COUNT(*) as count')
            )
            ->groupBy(DB::raw('DATE(created_at)'), 'interaction_type')
            ->orderBy('date')
            ->get()
            ->groupBy('date');

        // Price range analysis
        $priceRanges = UserInteraction::join('items', 'user_interactions.item_id', '=', 'items.id')
            ->where('user_interactions.created_at', '>', now()->subDays($days))
            ->whereNotNull('items.price')
            ->select(
                DB::raw('CASE 
                    WHEN items.price < 500 THEN "Under $500"
                    WHEN items.price < 1500 THEN "$500-$1500"
                    WHEN items.price < 3000 THEN "$1500-$3000"
                    ELSE "$3000+"
                END as price_range'),
                DB::raw('COUNT(*) as interaction_count')
            )
            ->groupBy('price_range')
            ->orderByDesc('interaction_count')
            ->get();

        return view('admin.analytics.index', compact(
            'totalInteractions', 'uniqueUsers', 'uniqueSessions', 
            'interactionTypes', 'popularCategories', 'popularItems', 
            'dailyTrends', 'priceRanges', 'days'
        ));
    }

    public function userDetails(Request $request, User $user)
    {
        $days = $request->get('days', 30);
        
        // User's interaction history
        $interactions = UserInteraction::with('item.category')
            ->where('user_id', $user->id)
            ->where('created_at', '>', now()->subDays($days))
            ->orderByDesc('created_at')
            ->paginate(50);

        // User's category interests
        $categoryInterests = UserInteraction::getUserCategoryInterests($user->id, $days);
        $categories = Category::whereIn('id', array_keys($categoryInterests))->get()->keyBy('id');

        // User's interaction summary
        $interactionSummary = UserInteraction::where('user_id', $user->id)
            ->where('created_at', '>', now()->subDays($days))
            ->select('interaction_type', DB::raw('COUNT(*) as count'))
            ->groupBy('interaction_type')
            ->get();

        // User's average price interest
        $avgPriceInterest = UserInteraction::getUserPriceInterests($user->id, $days);

        // User's preferences
        $preferences = $user->preferences;

        return view('admin.analytics.user-details', compact(
            'user', 'interactions', 'categoryInterests', 'categories',
            'interactionSummary', 'avgPriceInterest', 'preferences', 'days'
        ));
    }

    public function itemDetails(Request $request, Item $item)
    {
        $days = $request->get('days', 30);
        
        // Item's interaction history
        $interactions = UserInteraction::with('user')
            ->where('item_id', $item->id)
            ->where('created_at', '>', now()->subDays($days))
            ->orderByDesc('created_at')
            ->paginate(50);

        // Interaction breakdown
        $interactionBreakdown = UserInteraction::where('item_id', $item->id)
            ->where('created_at', '>', now()->subDays($days))
            ->select('interaction_type', DB::raw('COUNT(*) as count'))
            ->groupBy('interaction_type')
            ->get();

        // Hourly pattern
        $hourlyPattern = UserInteraction::where('item_id', $item->id)
            ->where('created_at', '>', now()->subDays($days))
            ->select(
                DB::raw('HOUR(created_at) as hour'),
                DB::raw('COUNT(*) as count')
            )
            ->groupBy(DB::raw('HOUR(created_at)'))
            ->orderBy('hour')
            ->get();

        // Unique users who interacted
        $uniqueUsers = UserInteraction::where('item_id', $item->id)
            ->where('created_at', '>', now()->subDays($days))
            ->whereNotNull('user_id')
            ->distinct('user_id')
            ->count();

        return view('admin.analytics.item-details', compact(
            'item', 'interactions', 'interactionBreakdown', 
            'hourlyPattern', 'uniqueUsers', 'days'
        ));
    }

    public function realtime()
    {
        // Real-time interactions (last 5 minutes)
        $recentInteractions = UserInteraction::with(['user', 'item.category'])
            ->where('created_at', '>', now()->subMinutes(5))
            ->orderByDesc('created_at')
            ->limit(50)
            ->get();

        // Currently active sessions (last 15 minutes)
        $activeSessions = UserInteraction::where('created_at', '>', now()->subMinutes(15))
            ->select(
                DB::raw('COALESCE(user_id, session_id) as identifier'),
                DB::raw('MAX(created_at) as last_activity'),
                DB::raw('COUNT(*) as actions')
            )
            ->groupBy(DB::raw('COALESCE(user_id, session_id)'))
            ->orderByDesc('last_activity')
            ->limit(20)
            ->get();

        return view('admin.analytics.realtime', compact('recentInteractions', 'activeSessions'));
    }

    public function export(Request $request)
    {
        $days = $request->get('days', 30);
        $type = $request->get('type', 'interactions');

        switch ($type) {
            case 'interactions':
                $data = UserInteraction::with(['user', 'item.category'])
                    ->where('created_at', '>', now()->subDays($days))
                    ->get();
                break;
            case 'categories':
                $data = UserInteraction::join('items', 'user_interactions.item_id', '=', 'items.id')
                    ->join('categories', 'items.category_id', '=', 'categories.id')
                    ->where('user_interactions.created_at', '>', now()->subDays($days))
                    ->select('categories.name', DB::raw('COUNT(*) as interaction_count'))
                    ->groupBy('categories.id', 'categories.name')
                    ->orderByDesc('interaction_count')
                    ->get();
                break;
            default:
                return back()->with('error', 'Invalid export type');
        }

        $filename = "analytics_{$type}_" . now()->format('Y-m-d_H-i-s') . ".json";
        
        return response()->json($data)
            ->header('Content-Disposition', "attachment; filename={$filename}");
    }
}