<?php

namespace App\Livewire;

use App\Exports\ProductionPlanExport;
use App\Models\ProductionPlan;
use App\Models\ProductionQuantity;
use Livewire\Component;
use Carbon\Carbon;
use DB;
use Maatwebsite\Excel\Facades\Excel;

class ProductionTargetPlan extends Component
{

    public $plantId, $lineId, $month, $year;

    public $records = [];

    public $dates = [];

    public $leaveDates = [];

    public $productionPlanDates = '';


    protected $listeners = [
        'loadData' => 'loadProductionData',
        'loadData1' => 'exportProductionData',
    ];

    public function getMonthDates($month, $year)
    {
        $start = Carbon::createFromDate($year, $month, 1);
        $days  = $start->daysInMonth;

        $dates = [];

        for ($i = 1; $i <= $days; $i++) {
            $dates[] = Carbon::createFromDate($year, $month, $i)
                ->format('Y-m-d');
        }

        return $dates;
    }

    public function loadProductionData($plantId, $lineId, $month, $year){

        if (!$plantId || !$lineId || !$month || !$year) {
            $this->records = [];
            $this->dates = [];
            $this->leaveDates = [];
            return;
        }

        $this->dates = $this->getMonthDates($month, $year);

        $data = ProductionPlan::query()
        ->join('items', 'items.id', '=', 'production_plans.item_id')
        ->join('lines', 'lines.id', '=', 'production_plans.line_id')
        ->join('plants', 'plants.id', '=', 'production_plans.plant_id')
        ->where('production_plans.plant_id', $plantId)
        ->where('production_plans.line_id', $lineId)
        ->whereMonth('production_plans.created_at', $month)
        ->whereYear('production_plans.created_at', $year)
        ->select(
            'production_plans.created_at',
            'production_plans.operator_id',
            'plants.name as plant',
            'items.code as item_code',
            'items.description as item_description',
            'lines.name as line_name',
            'production_plans.leave_dates'
        )
        ->first();

        if ($data && $data->leave_dates) {
            $this->leaveDates = array_map('trim', explode(',', $data->leave_dates));
        }

        $producedData = ProductionQuantity::selectRaw("
            plant_id,
            line_id,
            item_id,
            DATE(created_at) as prod_date,
            COUNT(*) as total_qty
        ")
        ->where('plant_id', $plantId)
        ->where('line_id', $lineId)
        ->whereMonth('created_at', $month)
        ->whereYear('created_at', $year)
        ->groupBy('plant_id', 'line_id', 'item_id', DB::raw('DATE(created_at)'))
        ->get()
        ->groupBy(function ($row) {
            return $row->plant_id . '_' . $row->line_id . '_' . $row->item_id;
        })
        ->map(function ($group) {
            return $group->keyBy('prod_date');
        });

        $this->records = ProductionPlan::query()
            ->join('items', 'items.id', '=', 'production_plans.item_id')
            ->join('lines', 'lines.id', '=', 'production_plans.line_id')
            ->join('plants', 'plants.id', '=', 'production_plans.plant_id')
            ->where('production_plans.plant_id', $plantId)
            ->where('production_plans.line_id', $lineId)
            ->whereMonth('production_plans.created_at', $month)
            ->whereYear('production_plans.created_at', $year)
            ->select(
                'production_plans.item_id',
                'production_plans.plant_id',
                'production_plans.line_id',
                'production_plans.plan_quantity',
                'production_plans.working_days',
                'items.code as item_code',
                'items.description as item_description',
                'lines.name as line_name',
                'plants.name as plant_name'
            )
            ->get()
            // ->map(function ($row) use ($producedData) {
            //     $row = $row->toArray();

            //     $row['daily_target'] = ($row['working_days'] > 0)
            //         ? round($row['plan_quantity'] / $row['working_days'], 2)
            //         : 0;

            //     // $key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id'];

            //     // foreach ($this->dates as $date) {
            //     //     $found = $producedData[$key][$date] ?? null;
            //     //     $row['produced_quantity'][$date] = $found->total_qty ?? 0;
            //     // }

            //     $remainingDays = $row['working_days'];
            //     $pendingQty = 0;

            //     $row['daily_target_dynamic'] = [];
            //     $row['produced_quantity'] = [];

            //     $key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id'];

            //     foreach ($this->dates as $date) {

            //         $found = $producedData[$key][$date] ?? null;
            //         $producedQty = $found->total_qty ?? 0;

            //         // today's adjusted target
            //         $todayTarget = $baseDailyTarget;

            //         if ($remainingDays > 1 && $pendingQty > 0) {
            //             $todayTarget += $pendingQty / $remainingDays;
            //         }

            //         $row['daily_target_dynamic'][$date] = round($todayTarget, 2);
            //         $row['produced_quantity'][$date] = $producedQty;

            //         // calculate today's shortfall
            //         $pendingQty += ($todayTarget - $producedQty);

            //         if ($pendingQty < 0) {
            //             $pendingQty = 0;
            //         }

            //         $remainingDays--;
            //     }

            //     return $row;
            // })
            ->map(function ($row) use ($producedData) {

                $row = $row->toArray();

                $remainingQty = $row['plan_quantity'];
                $remainingDays = $row['working_days'];

                $row['daily_target_dynamic'] = [];
                $row['produced_quantity'] = [];

                $key = $row['plant_id'].'_'.$row['line_id'].'_'.$row['item_id'];

                foreach ($this->dates as $date) {

                    // Skip leave dates
                    if (in_array($date, $this->leaveDates)) {
                        $row['daily_target_dynamic'][$date] = '-';
                        $row['produced_quantity'][$date] = '-';
                        continue;
                    }

                    $todayTarget = $remainingDays > 0
                        ? round($remainingQty / $remainingDays, 2)
                        : 0;

                    //$todayTarget = $remainingDays > 0
                    // ? $remainingQty / $remainingDays
                    // : 0;

                    $producedQty = isset($producedData[$key][$date])
                        ? $producedData[$key][$date]->total_qty
                        : 0;

                    $row['daily_target_dynamic'][$date] = $todayTarget;
                    $row['produced_quantity'][$date] = $producedQty;

                    // Carry forward pending
                    $remainingQty -= $producedQty;
                    if ($remainingQty < 0) {
                        $remainingQty = 0;
                    }

                    $remainingDays--;
                }

                return $row;
            })
            ->toArray();
    }

    public function exportProductionData()
    {
        return Excel::download(
            new ProductionPlanExport($this->records, $this->dates),
            'production_plan_data.xlsx'
        );
    }

    public function render()
    {
        // return view('livewire.production-target-plan');
        return view('livewire.production-target-plan', [
            'records' => $this->records,
            'dates'   => $this->dates,
        ]);
    }
}
