<?php

namespace App\Http\Controllers;

use App\Models\StockEntry;
use Illuminate\Http\Request;
use App\Models\Item;
use Illuminate\Support\Facades\DB;

class StockEntryController extends Controller
{
    
    public function index()
{
    $entries = StockEntry::with('details.item')
        ->orderByDesc('entry_date')
        ->orderByDesc('id')
        ->get();

    return view('barang-masuk.index', compact('entries'));
}

    public function create()
{
    $items = Item::where('is_active', true)
        ->orderBy('name')
        ->get();

    return view('barang-masuk.create', compact('items'));
}

    
public function store(Request $request)
{
    $validated = $request->validate([
        'reference_number' => [
            'required',
            'string',
            'max:100',
            'unique:stock_entries,reference_number',
        ],
        'entry_date' => ['required', 'date'],
        'funding_source' => [
            'required',
            \Illuminate\Validation\Rule::in([
                'BOS',
                'Yayasan',
                'lainnya',
            ]),
        ],
        'funding_source_other' => [
            'nullable',
            'required_if:funding_source,lainnya',
            'string',
            'max:255',
        ],
        'document_number' => ['nullable', 'string', 'max:100'],
        'notes' => ['nullable', 'string'],

        'item_id' => ['required', 'array', 'min:1'],
        'item_id.*' => [
            'required',
            'integer',
            'exists:items,id',
        ],

        'quantity' => ['required', 'array'],
        'quantity.*' => ['required', 'integer', 'min:1'],

        'unit_price' => ['required', 'array'],
        'unit_price.*' => ['required', 'numeric', 'min:0'],

        'detail_notes' => ['nullable', 'array'],
        'detail_notes.*' => ['nullable', 'string', 'max:1000'],
    ]);

    // Pastikan semua baris memiliki jumlah data yang sama.
    $rowCount = count($validated['item_id']);

    if (
        count($validated['quantity']) !== $rowCount ||
        count($validated['unit_price']) !== $rowCount ||
        (
            isset($validated['detail_notes']) &&
            count($validated['detail_notes']) !== $rowCount
        )
    ) {
        return back()
            ->withInput()
            ->withErrors([
                'items' => 'Rincian barang tidak lengkap. Silakan periksa kembali.',
            ]);
    }

    // Hitung subtotal dan total di server, bukan dari browser.
    $total = 0;

    foreach ($validated['item_id'] as $index => $itemId) {
        $quantity = (int) $validated['quantity'][$index];
        $price = (float) $validated['unit_price'][$index];

        $total += $quantity * $price;
    }

    DB::transaction(function () use ($validated, $total) {
        $entry = StockEntry::create([
            'reference_number' => $validated['reference_number'],
            'entry_date' => $validated['entry_date'],
            'funding_source' => $validated['funding_source'],
            'funding_source_other' =>
                $validated['funding_source'] === 'lainnya'
                    ? $validated['funding_source_other']
                    : null,
            'document_number' => $validated['document_number'] ?? null,
            'total_amount' => $total,
            'notes' => $validated['notes'] ?? null,
            'created_by' => auth()->id(),
        ]);

        foreach ($validated['item_id'] as $index => $itemId) {
            $quantity = (int) $validated['quantity'][$index];
            $price = (float) $validated['unit_price'][$index];

            $entry->details()->create([
                'item_id' => $itemId,
                'quantity' => $quantity,
                'unit_price' => $price,
                'subtotal' => $quantity * $price,
                'notes' => $validated['detail_notes'][$index] ?? null,
            ]);
        }
    });

    return redirect()
        ->route('barang-masuk.index')
        ->with('success', 'Transaksi barang masuk berhasil disimpan.');
}


    public function show(StockEntry $barang_masuk)
    {
    $barang_masuk->load('details.item');

    return view('barang-masuk.show', compact('barang_masuk'));
    }

    public function edit(StockEntry $barang_masuk)
    {
        return redirect()->route('barang-masuk.index');
    }

    public function update(Request $request, StockEntry $barang_masuk)
    {
        return redirect()->route('barang-masuk.index');
    }

    public function destroy(StockEntry $barang_masuk)
    {
        return redirect()
            ->route('barang-masuk.index')
            ->with('error', 'Penghapusan transaksi belum diaktifkan.');
    }
    
}
