<?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()
    {
        
        $user     = auth()->user();
        $userRole = $user->role?->name ?? 'staff';
        $isDesigner = $user->role?->name === 'designer';
        $isCheckMeasure = $user->role?->name === 'check_measurer';
        $isProcessor = $user->role?->name === 'processor';
        $isEmployee = $user->role?->name === 'factory_employee';

        // ── TRADES: personal dashboard ────────────────────────────────────────
        if ($userRole === 'trades') {
            $myJobs = $user->assignedJobs()
                ->with('contact')
                ->where('status', '!=', 'completed')
                ->orderByDesc('updated_at')
                ->get();

            $completedJobsCount = $user->assignedJobs()
                ->where('status', 'completed')
                ->count();

            $runningEntry = $user->timeEntries()
                ->where('status', 'running')
                ->with('job.contact', 'taskType')
                ->first();

            $hoursThisWeek = round(
                $user->timeEntries()
                    ->where('status', 'completed')
                    ->whereBetween('started_at', [
                        Carbon::now()->startOfWeek(),
                        Carbon::now()->endOfWeek(),
                    ])
                    ->sum('duration_minutes') / 60,
                1
            );

            $recentTimeEntries = $user->timeEntries()
                ->with('job.contact', 'taskType')
                ->where('status', 'completed')
                ->latest('started_at')
                ->take(6)
                ->get();

            return view('dashboard.index', compact(
                'userRole',
                'myJobs', 'completedJobsCount',
                'runningEntry', 'hoursThisWeek', 'recentTimeEntries'
            ));
        }

        // ── ALL OTHER ROLES: full dashboard ───────────────────────────────────
        $isAdmin   = in_array($userRole, ['office_admin', 'project_manager']);
        $isFinance = in_array($userRole, ['office_admin', 'project_manager', 'accounts']);

        if($isDesigner){
            $totalJobs     = Job::where('designer_id', $user->id)->count();
            $activeJobs    = Job::where('designer_id', $user->id)->where('status', 'active')->count();
            $jobsThisMonth = Job::where('designer_id', $user->id)->whereMonth('created_at', Carbon::now()->month)->count();
            $overdueItems  = Job::where('designer_id', $user->id)->where('status', 'active')
                ->whereNotNull('expected_completion')
                ->where('expected_completion', '<', Carbon::today())
                ->count();
        }elseif($isCheckMeasure){
            $totalJobs     = Job::where('deposit_paid', '>', 0)->where('contract_signed',true)->count();
            $activeJobs    = Job::where('deposit_paid', '>', 0)->where('contract_signed',true)->where('status', 'active')->count();
            $jobsThisMonth = Job::where('deposit_paid', '>', 0)->where('contract_signed',true)->whereMonth('created_at', Carbon::now()->month)->count();
            $overdueItems  = Job::where('deposit_paid', '>', 0)->where('contract_signed',true)->where('status', 'active')
                ->whereNotNull('expected_completion')
                ->where('expected_completion', '<', Carbon::today())
                ->count();
        }elseif($isProcessor){
            $totalJobs     = Job::with(['contact', 'consultant', 'manager'])->whereHas('checkMeasures', fn($q) => $q->where('status', 'completed'))->where('stage','processing')->count();
            $activeJobs    = Job::with(['contact', 'consultant', 'manager'])->whereHas('checkMeasures', fn($q) => $q->where('status', 'completed'))->where('stage','processing')->count();
            $jobsThisMonth = Job::with(['contact', 'consultant', 'manager'])->whereHas('checkMeasures', fn($q) => $q->where('status', 'completed'))->where('stage','processing')->whereMonth('created_at', Carbon::now()->month)->count();
            $overdueItems  = Job::with(['contact', 'consultant', 'manager'])->whereHas('checkMeasures', fn($q) => $q->where('status', 'completed'))->where('stage','processing')->where('status', 'active')
                ->whereNotNull('expected_completion')
                ->where('expected_completion', '<', Carbon::today())
                ->count();
        }elseif($isEmployee){
            $totalJobs     = Job::with(['contact', 'consultant', 'manager'])->whereHas('checkMeasures', fn($q) => $q->where('status', 'completed'))->where('stage','processing')->count();
            $activeJobs    = Job::with(['contact', 'consultant', 'manager'])->whereHas('checkMeasures', fn($q) => $q->where('status', 'completed'))->where('stage','processing')->count();
            $jobsThisMonth = Job::with(['contact', 'consultant', 'manager'])->whereHas('checkMeasures', fn($q) => $q->where('status', 'completed'))->where('stage','processing')->whereMonth('created_at', Carbon::now()->month)->count();
            $overdueItems  = Job::with(['contact', 'consultant', 'manager'])->whereHas('checkMeasures', fn($q) => $q->where('status', 'completed'))->where('stage','processing')->where('status', 'active')
                ->whereNotNull('expected_completion')
                ->where('expected_completion', '<', Carbon::today())
                ->count();
        }else{
            $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();
        }

        // KPI cards
        

        // Pipeline
        $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 — filtered by role

        
        
        if($isDesigner){
            $recentJobs      = Job::with('contact')->where('designer_id', $user->id)->latest()->take(8)->get();
        }elseif($isCheckMeasure){
            $recentJobs      = Job::with('contact')->where('deposit_paid', '>', 0)->where('contract_signed',true)->latest()->take(8)->get();
        }elseif($isProcessor){
            $recentJobs      = Job::with(['contact', 'consultant', 'manager'])->whereHas('checkMeasures', fn($q) => $q->where('status', 'completed'))->where('stage','processing')->latest()->take(8)->get();
        }elseif($isEmployee){
            $recentJobs      = Job::with(['contact', 'consultant', 'manager'])->whereHas('checkMeasures', fn($q) => $q->where('status', 'completed'))->where('stage','processing')->latest()->take(8)->get();
        }else{
            $recentJobs      = Job::with('contact')->latest()->take(8)->get();
        }
        
        $recentLeads     = $isAdmin    ? Lead::with('contact')->latest()->take(5)->get()              : collect();
        $recentQuotes    = $isFinance  ? Quote::with(['job', 'contact'])->latest()->take(5)->get()    : collect();
        $recentContracts = $isFinance  ? Contract::with(['job', 'contact'])->latest()->take(5)->get() : collect();

        $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 — admin / PM / accounts only
        $contractsJobs           = collect();
        $unsignedContracts       = 0;
        $pendingDepositContracts = 0;
        $processingStats         = collect();
        $deliveryJobs            = collect();
        $scheduledDeliveries     = collect();
        $installationJobs        = collect();
        $upcomingInstalls        = collect();

        if ($isFinance) {
            $contractsJobs = Job::with(['contact', 'contracts'])
                ->where('stage', 'contracts')->latest()->take(8)->get();
            $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();
            $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();
            $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();
            $upcomingInstalls = CalendarEvent::with('assignedTo')
                ->where('type', 'installation')->where('start_at', '>=', Carbon::now())
                ->orderBy('start_at')->take(5)->get();
        }

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