<?php

namespace App\Http\Controllers;

use App\Models\Lead;
use App\Models\Job;
use App\Models\Quote;
use App\Models\Contract;
use App\Models\Delivery;
use App\Models\Installation;
use App\Models\Completion;
use App\Models\ProcessingOrder;
use App\Models\CalendarEvent;
use App\Models\Task;
use Carbon\Carbon;

class DashboardController extends Controller
{
    public function index()
    {
        // ── KPI cards ────────────────────────────────────────────────────────
        $totalJobs = Job::count();
        $activeJobs = Job::where('status', 'active')->count();
        $jobsThisMonth = Job::whereMonth('created_at', Carbon::now()->month)->count();
        $overdueItems = Job::where('status', 'active')
            ->whereNotNull('expected_completion')
            ->where('expected_completion', '<', Carbon::today())
            ->count();

        // ── Pipeline stage counts ─────────────────────────────────────────────
        $pipeline = [
            'lead'         => Job::where('stage', 'lead')->count(),
            'consult'      => Job::where('stage', 'consult')->count(),
            'sold'         => Job::where('stage', 'sold')->count(),
            'contracts'    => Job::where('stage', 'contracts')->count(),
            'cm'           => Job::where('stage', 'cm')->count(),
            'processing'   => Job::where('stage', 'processing')->count(),
            'delivery'     => Job::where('stage', 'delivery')->count(),
            'installation' => Job::where('stage', 'installation')->count(),
            'completion'   => Job::where('stage', 'completion')->count(),
        ];

        // ── Recent data ───────────────────────────────────────────────────────
        $recentLeads     = Lead::with('contact')->latest()->take(5)->get();
        $recentJobs      = Job::with('contact')->latest()->take(8)->get();
        $recentQuotes    = Quote::with(['job', 'contact'])->latest()->take(5)->get();
        $recentContracts = Contract::with(['job', 'contact'])->latest()->take(5)->get();

        $upcomingEvents = CalendarEvent::where('start_at', '>=', Carbon::now())
            ->orderBy('start_at')
            ->take(5)
            ->get();

        $pendingTasks = Task::where('status', '!=', 'completed')
            ->orderBy('due_date')
            ->take(5)
            ->get();

        // ── Operational panels (Contracts Admin, Processing, Pre-Delivery, Install/Complete) ─
        $contractsJobs = Job::with(['contact', 'contracts'])
            ->where('stage', 'contracts')
            ->latest()
            ->take(8)
            ->get();

        // Count contracts that still need signing
        $unsignedContracts = Contract::whereNull('signed_date')->count();
        $pendingDepositContracts = Job::where('stage', 'contracts')
            ->where('deposit_paid', false)
            ->count();

        $processingJobs = Job::with(['contact', 'productionOrders'])
            ->where('stage', 'processing')
            ->latest()
            ->take(8)
            ->get();

        // For each processing job, tally order counts
        $processingStats = $processingJobs->map(fn($job) => [
            'job'       => $job,
            'total'     => $job->productionOrders?->count() ?? 0,
            'completed' => $job->productionOrders?->where('status', 'completed')->count() ?? 0,
            'pending'   => $job->productionOrders?->whereIn('status', ['pending','ordered','in_progress'])->count() ?? 0,
        ]);

        $deliveryJobs = Job::with('contact')
            ->where('stage', 'delivery')
            ->latest()
            ->take(8)
            ->get();

        // Recent deliveries scheduled
        $scheduledDeliveries = Delivery::with(['job.contact'])
            ->whereNull('delivered_at')
            ->whereNotNull('scheduled_date')
            ->orderBy('scheduled_date')
            ->take(5)
            ->get();

        $installationJobs = Job::with('contact')
            ->whereIn('stage', ['installation', 'completion'])
            ->latest()
            ->take(8)
            ->get();

        // Upcoming installations from the calendar
        $upcomingInstalls = CalendarEvent::with('assignedTo')
            ->where('type', 'installation')
            ->where('start_at', '>=', Carbon::now())
            ->orderBy('start_at')
            ->take(5)
            ->get();

        return view('dashboard.index', compact(
            'totalJobs', 'activeJobs', 'jobsThisMonth', 'overdueItems',
            'pipeline', 'recentLeads', 'recentJobs', 'recentQuotes', 'recentContracts',
            'upcomingEvents', 'pendingTasks',
            // Operational panels
            'contractsJobs', 'unsignedContracts', 'pendingDepositContracts',
            'processingStats',
            'deliveryJobs', 'scheduledDeliveries',
            'installationJobs', 'upcomingInstalls'
        ));
    }
}
