<?php

namespace App\Http\Controllers;

use App\Models\PoBuyerInvoice;
use App\Models\PoSupplierInvoice;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class BeaCukaiSubconController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        // 1. Tarik data Supplier
        $poSupplierInvoice = PoSupplierInvoice::get();
        $poBuyerInvoice = PoBuyerInvoice::get();

        $data = [];

        foreach ($poBuyerInvoice as $item) {
            if (isset($item->bc_data['is_subcon']) && $item->bc_data['is_subcon'] == true) {
                $item->source_type = 'from_invoice_po_buyer';
                $data[] = $item;
            }
        }

        foreach ($poSupplierInvoice as $item) {
            if (isset($item->bc_data['is_subcon']) && $item->bc_data['is_subcon'] == true) {
                $item->source_type = 'from_invoice_po_supplier';
                $data[] = $item;
            }
        }

        usort($data, function($a, $b) {
            return $b->created_at <=> $a->created_at;
        });

        return view('pages.bea-cukai.subcon.index', [
            'po_supplier_invoices' => $poSupplierInvoice->where('bc_status', false),
            'po_buyer_invoices'    => $poBuyerInvoice->where('bc_status', false),
            'data'                 => $data
        ]);
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create(Request $request)
    {
        $validated = $request->validate([
            'option'        => 'required|in:from_invoice_po_buyer,from_invoice_po_supplier',
            'invoice_no'    => 'nullable'
        ]);

        switch ($validated['option']) {
            case 'from_invoice_po_buyer':
                $invoice = PoBuyerInvoice::where('no', $validated['invoice_no'])->firstOrFail();
                return view('pages.bea-cukai.subcon.create', [
                    'invoice' => $invoice->load('details.material')
                ]);
            break;

            case 'from_invoice_po_supplier':
                $invoice = PoSupplierInvoice::where('no', $validated['invoice_no'])->firstOrFail();
                return view('pages.bea-cukai.subcon.create', [
                    'invoice' => $invoice->load('details.material')
                ]);
            break;

            default:
                return redirect()->back()->with('error', 'Invalid option selected');
        }
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
            'option'             => 'required|in:from_invoice_po_buyer,from_invoice_po_supplier',
            'invoice_no'         => 'required_if:option,from_invoice_po_buyer',
            'no'                 => 'required|string|max:255',
            'date'               => 'required|date',
            'type'               => 'required|string',    
            'nopol'              => 'required|string',
            'pengangkut'         => 'required|string',
            'forwarder'          => 'required|string',
            'eta'                => 'required|date',
            'etd'                => 'required|date',
            'nama_kapal'         => 'required|string',
            'awb'                => 'required|string',
            'no_kontainer'       => 'required|string',
            'jumlah_kontainer'   => 'required|numeric',
            'no_karantina'       => 'required|string',
            'tanggal_karantina'  => 'required|date',
        ]);

        DB::beginTransaction();

        try {
            switch ($validated['option']) {
                case 'from_invoice_po_buyer':
                    $invoice = PoBuyerInvoice::where('no', $validated['invoice_no'])->firstOrFail();

                    unset($validated['option']);
                    unset($validated['invoice_no']);
                    $validated['is_subcon'] = true;

                    $invoice->bc_data = $validated;
                    $invoice->bc_status = true;
                    $invoice->save();

                    DB::commit();
                    return redirect()->route('bea-cukai.subcon.index')->with('success', 'Bea Cukai Subcon created successfully from Invoice PO Buyer');

                case 'from_invoice_po_supplier':
                    $invoice = PoSupplierInvoice::where('no', $validated['invoice_no'])->firstOrFail();

                    unset($validated['option']);
                    unset($validated['invoice_no']);
                    $validated['is_subcon'] = true;

                    $invoice->bc_data = $validated;
                    $invoice->bc_status = true;
                    $invoice->save();

                    DB::commit();
                    return redirect()->route('bea-cukai.subcon.index')->with('success', 'Bea Cukai Subcon created successfully from Invoice PO Supplier');
                break;
                    
                default:
                    DB::rollBack();
                    return redirect()->back()->with('error', 'Invalid option selected');
            }


        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()->back()->with('error', 'Failed to create Bea Cukai Subcon: ' . $e->getMessage());
        }
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(Request $request)
    {
        $validated = $request->validate([
            'invoice_no'    => 'required',
            'option'        => 'required'
        ]);

        switch ($validated['option']) {
            case 'from_invoice_po_buyer':
                $invoice = PoBuyerInvoice::where('no', $validated['invoice_no'])->firstOrFail();
            break;

            case 'from_invoice_po_supplier':
                $invoice = PoSupplierInvoice::where('no', $validated['invoice_no'])->firstOrFail();
            break;

            default:
                return redirect()->back()->with('error', 'Invalid option selected');
        }

        return view('pages.bea-cukai.subcon.edit', [
            'invoice' => $invoice->load('details.material')
        ]);
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request)
    {
        $validated = $request->validate([
            'invoice_no'    => 'required',
            'option'        => 'required',
            'no'            => 'required|string|max:255',
            'date'          => 'required|date',
            'type'          => 'required|string',    
            'nopol'         => 'required|string',
            'pengangkut'    => 'required|string',
            'forwarder'     => 'required|string',
            'eta'           => 'required|date',
            'etd'           => 'required|date',
            'nama_kapal'    => 'required|string',
            'awb'           => 'required|string',
            'no_kontainer'  => 'required|string',
            'jumlah_kontainer'   => 'required|numeric',
            'no_karantina'       => 'required|string',
            'tanggal_karantina'  => 'required|date',
        ]);

        switch ($validated['option']) {
            case 'from_invoice_po_buyer':
                $invoice = PoBuyerInvoice::where('no', $validated['invoice_no'])->firstOrFail();
            break;

            case 'from_invoice_po_supplier':
                $invoice = PoSupplierInvoice::where('no', $validated['invoice_no'])->firstOrFail();
            break;

            default:
                return redirect()->back()->with('error', 'Invalid option selected');
        }

        unset($validated['option']);
        unset($validated['invoice_no']);
        $validated['is_subcon'] = true;

        $invoice->bc_data = $validated;
        $invoice->save();

        return redirect()->route('bea-cukai.subcon.index')->with('success', 'Bea Cukai Subcon updated successfully');
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        //
    }
}
