<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Controllers\Concerns\LogsAdminActions;
use Illuminate\Http\Request;
use App\Models\Item;

class AdminItemController extends Controller
{
    use LogsAdminActions;

    public function index(Request $request)
    {
        $query = Item::with(['user', 'category', 'manufacturer']);

        // Filter by status
        if ($request->filled('status')) {
            $query->where('status', $request->status);
        }

        // Filter by listing type
        if ($request->filled('type')) {
            $query->where('listing_type', $request->type);
        }

        // Search
        if ($request->filled('search')) {
            $search = $request->search;
            $query->where(function($q) use ($search) {
                $q->where('title', 'like', "%{$search}%")
                  ->orWhere('description', 'like', "%{$search}%")
                  ->orWhereHas('user', function($userQuery) use ($search) {
                      $userQuery->where('name', 'like', "%{$search}%")
                               ->orWhere('email', 'like', "%{$search}%");
                  });
            });
        }

        $items = $query->latest()->paginate(20)->withQueryString();

        return view('admin.items.index', compact('items'));
    }

    public function show(Item $item)
    {
        $item->load(['user', 'category', 'manufacturer', 'photos', 'buyQueue.user', 'conversations']);
        return view('admin.items.show', compact('item'));
    }

    public function update(Request $request, Item $item)
    {
        $validated = $request->validate([
            'status' => 'required|in:draft,active,sold,trade_pending,sale_pending,archived,flagged,removed',
            'admin_notes' => 'nullable|string|max:5000',
            'admin_note' => 'nullable|string|max:1000',
        ]);

        $oldStatus = $item->status;
        $item->status = $validated['status'];
        if (array_key_exists('admin_notes', $validated)) {
            $item->admin_notes = $validated['admin_notes'];
        }
        if (array_key_exists('admin_note', $validated)) {
            $item->admin_note = $validated['admin_note'];
        }
        $item->save();

        $this->auditLog('update_item', $item, [
            'item_title' => $item->title,
            'old_status' => $oldStatus,
            'new_status' => $validated['status'],
        ]);

        return back()->with('success', 'Item updated successfully');
    }

    public function destroy(Item $item)
    {
        $this->auditLog('delete_item', $item, [
            'item_title'  => $item->title,
            'owner_id'    => $item->user_id,
            'photo_count' => $item->photos->count(),
        ]);

        foreach ($item->photos as $photo) {
            \Storage::disk('images')->delete($photo->path);
            $photo->delete();
        }

        $item->delete();

        return redirect()->route('admin.items.index')
            ->with('success', 'Item deleted successfully');
    }

    public function remove(Request $request, Item $item)
    {
        $item->status     = 'removed';
        $item->admin_note = $request->input('reason');
        $item->save();

        $this->auditLog('remove_item', $item, [
            'item_title' => $item->title,
            'owner_id'   => $item->user_id,
            'reason'     => $request->input('reason'),
        ]);

        return back()->with('success', 'Item removed.');
    }

    public function approve(Item $item)
    {
        $item->status     = 'active';
        $item->admin_note = null;
        $item->save();

        $this->auditLog('approve_item', $item, [
            'item_title' => $item->title,
            'owner_id'   => $item->user_id,
        ]);

        return back()->with('success', 'Item approved successfully');
    }
}
