<?php

namespace App\Http\Controllers\StaffProduksi;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Produk;
use App\Models\Produksi;
use App\Models\StokProduk; // Tambahkan ini
use Carbon\Carbon;
use Illuminate\Support\Facades\DB; // Tambahkan ini untuk keamanan data

class ProduksiController extends Controller
{
    
    public function index(Request $request)
    {
        $daftarProduk = Produk::all();
        $start_date = $request->get('start_date', Carbon::now()->startOfMonth()->format('Y-m-d'));
        $end_date = $request->get('end_date', Carbon::now()->format('Y-m-d'));

        $dataProduksi = Produksi::with('produk')
            ->whereBetween('tanggal_produksi', [$start_date, $end_date])
            ->orderBy('tanggal_produksi', 'desc')
            ->get()
            ->groupBy(fn($item) => Carbon::parse($item->tanggal_produksi)->format('Y-m-d'));

        return view('staffproduksi.produksi.index', compact('daftarProduk', 'dataProduksi', 'start_date', 'end_date'));
    }

    public function create()
    {
        $daftarProduk = Produk::where('status', 'Aktif')->get();
        return view('staffproduksi.produksi.create', compact('daftarProduk'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'tanggal_produksi' => 'required|date',
            'produksi' => 'required|array',
            'produksi.*.jumlah_produksi' => 'nullable|integer|min:0',
            'produksi.*.produk_id' => 'required|exists:produks,id',
        ]);

        $hasData = false;

        // Gunakan Transaction agar jika stok gagal update, data produksi juga tidak tersimpan
        DB::transaction(function () use ($request, &$hasData) {
            foreach ($request->produksi as $item) {
                if ($item['jumlah_produksi'] > 0) {
                    // 1. Simpan Riwayat Produksi
                    Produksi::create([
                        'tanggal_produksi' => $request->tanggal_produksi,
                        'produk_id' => $item['produk_id'],
                        'jumlah_produksi' => $item['jumlah_produksi'],
                    ]);

                    // 2. UPDATE STOK OTOMATIS (Ini kuncinya!)
                    $stok = StokProduk::firstOrCreate(
                        ['produk_id' => $item['produk_id']],
                        ['jumlah_stok' => 0]
                    );
                    $stok->increment('jumlah_stok', $item['jumlah_produksi']);

                    $hasData = true;
                }
            }
        });

        if (!$hasData) {
            return redirect()->back()->withErrors(['error' => 'Minimal satu jumlah produksi harus diisi lebih dari 0.']);
        }

        return redirect()->route('staffproduksi.produksi.index')->with('success', 'Data produksi disimpan dan stok gudang bertambah!');
    }

    public function edit($tanggal)
    {
        $daftarProduk = Produk::where('status', 'Aktif')->get();
        $dataExisting = Produksi::where('tanggal_produksi', $tanggal)->get();
        return view('staffproduksi.produksi.edit', compact('daftarProduk', 'dataExisting', 'tanggal'));
    }

    public function update(Request $request, $tanggal)
    {
        $request->validate([
            'produksi' => 'required|array',
            'produksi.*.jumlah_produksi' => 'nullable|integer|min:0',
        ]);

        DB::transaction(function () use ($request, $tanggal) {
            // A. Kurangi stok lama dulu (Revert stok sebelum data dihapus)
            $oldData = Produksi::where('tanggal_produksi', $tanggal)->get();
            foreach ($oldData as $old) {
                $stok = StokProduk::where('produk_id', $old->produk_id)->first();
                if ($stok) {
                    $stok->decrement('jumlah_stok', $old->jumlah_produksi);
                }
            }

            // B. Hapus data lama
            Produksi::where('tanggal_produksi', $tanggal)->delete();

            // C. Masukkan data baru dan tambah stok lagi
            foreach ($request->produksi as $item) {
                if ($item['jumlah_produksi'] > 0) {
                    Produksi::create([
                        'tanggal_produksi' => $tanggal,
                        'produk_id' => $item['produk_id'],
                        'jumlah_produksi' => $item['jumlah_produksi'],
                    ]);

                    $stok = StokProduk::firstOrCreate(
                        ['produk_id' => $item['produk_id']],
                        ['jumlah_stok' => 0]
                    );
                    $stok->increment('jumlah_stok', $item['jumlah_produksi']);
                }
            }
        });

        return redirect()->route('staffproduksi.produksi.index')->with('success', 'Data produksi dan saldo stok berhasil diperbarui!');
    }

    public function destroy($tanggal)
    {
        DB::transaction(function () use ($tanggal) {
            // Kurangi saldo stok sebelum riwayat dihapus
            $data = Produksi::where('tanggal_produksi', $tanggal)->get();
            foreach ($data as $item) {
                $stok = StokProduk::where('produk_id', $item->produk_id)->first();
                if ($stok) {
                    $stok->decrement('jumlah_stok', $item->jumlah_produksi);
                }
            }
            Produksi::where('tanggal_produksi', $tanggal)->delete();
        });

        return redirect()->back()->with('success', 'Data produksi dihapus dan stok telah disesuaikan.');
    }
}