<?php

namespace App\Http\Controllers;

use App\Models\MenuModel;
use App\Models\TransaksiModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;

use function PHPUnit\Framework\returnSelf;

class TransaksiController extends Controller
{
    public function index(){
        
        $dataMenu = MenuModel::all();
        $dataTransaksi = TransaksiModel::where('status_cart', 1)->get();
        $firstStatusBayar = $dataTransaksi->first() ? $dataTransaksi->first()->status_bayar : null;
        return view('Transaksi.transaksi',compact('dataTransaksi','dataMenu','firstStatusBayar'));
    }

    function SimpanPesanan(Request $request){
        $aturan = [
            'for_pesanan' => 'required',
            // 'for_pesanan' => 'required|unique:menu,nama',
        ];
    
        $messages = [
            'required' => 'Tidak boleh kosong',   
            'unique' => 'Already',   
        ];
    
        $validator = Validator::make($request->all(), $aturan, $messages);
        try {
            if ($validator->fails()) {
                return redirect()
                    ->route('transaksi')
                    ->withErrors($validator)->withInput();
            } else {
                // Decode JSON string to array
                $pesanan = json_decode($request->for_pesanan, true);
                $dataHargaPesananPlusQty = $request->for_qty * $request->for_harga;
                $insert = TransaksiModel::create([
                    'pesanan' => $pesanan['name'],  // Save the name of the menu
                    'qty' => $request->for_qty,
                    'request_customer' => $request->for_request ? $request->for_request : 'Tidak ada request',
                    'harga_pesanan' => $request->for_harga,
                    'harga_pesanan_plus_qty' => $dataHargaPesananPlusQty,
                    'nama_kasir' => Auth::user()->name,
                    'status_cart' => 1,
                    'status_bayar' => 'On Process',
                ]);
    
                if ($insert) {
                    return redirect()->route('transaksi')
                        ->with('success', 'Pesanan ditambah');
                }
            }
        } catch (\Throwable $th) {
            return redirect()
                ->route('transaksi')
                ->with('danger', $th->getMessage());
        }
    }
    

    public function HapusTransaksi($id)
    {
        try {
            // Ambil data transaksi berdasarkan id
            $transaksi = TransaksiModel::findOrFail($id);
            $pesanan = $transaksi->pesanan;
    
            // Menghapus data berdasarkan id
            $delete = $transaksi->delete();
    
            if ($delete) {
                return redirect()
                    ->route('transaksi')
                    ->with('success', 'Berhasil hapus menu dengan pesanan: ' . $pesanan);
            }
        }
        catch (\Throwable $th) 
        { 
            return redirect()
                ->route('transaksi')
                ->with('danger', $th->getMessage());
        }
    }

    public function HapusListTransaksi($id)
{
    try {
        // Ambil data transaksi berdasarkan id
        $transaksi = TransaksiModel::findOrFail($id);
        $kode_pesanan = $transaksi->kode_pesanan;
        $pesanan = $transaksi->pesanan;

        // Ambil semua data transaksi yang memiliki kode_pesanan yang sama
        $transaksiSameKode = TransaksiModel::where('kode_pesanan', $kode_pesanan)->get();

        if ($transaksiSameKode->isEmpty()) {
            return redirect()
                ->route('list-transaksi-lunas')
                ->with('danger', 'Tidak ada pesanan dengan kode tersebut: ' . $kode_pesanan);
        }
        
        // Menghapus semua data yang memiliki kode_pesanan yang sama
        foreach ($transaksiSameKode as $item) {
            $item->delete();
        }

        return redirect()
            ->route('list-transaksi-lunas')
            ->with('success', 'Semua pesanan dengan kode ' . $kode_pesanan . ' berhasil dihapus.');
    } catch (\Throwable $th) {
        return redirect()
            ->route('list-transaksi-lunas')
            ->with('danger', $th->getMessage());
    }


}

    

    function SimpanUpdatePesanan(Request $request){
        
        $aturan = 
        [
            'for_nama_pemesan'      => 'required',
            'for_nomor_meja'        => 'required',
            'for_metode_bayar'      => 'required',
            'for_status_bayar'      => 'required',
            'for_jenis_pesanan'     => 'required',
            // 'for_pesanan'      => 'required|unique:menu,nama',
        ];

        // dd($request->all());


        $messages =  
        [
             'required' => 'Tidak boleh kosong',   
             'unique' => 'Already',   
        ];

        $validator = Validator::make($request->all(), $aturan, $messages); 
        if ($validator->fails()) { 
            return redirect() 
            ->route('transaksi') 
            ->withErrors($validator) 
            ->withInput(); }

        $dataTransaksi = TransaksiModel::where('status_cart', 1)->get();
        function generateKode() 
        {  
            $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 
            $randomChars = substr(str_shuffle($chars), 0, 3); 
            $number = str_pad(rand(1, 999), 3, '0', STR_PAD_LEFT);  
            return 'TR-' . $randomChars . $number; }  
            
            $kodeGenerate = generateKode();

            $grandTotal = 0; foreach 
            ($dataTransaksi as $transaksi) 
            { $grandTotal += $transaksi->qty * $transaksi->harga_pesanan; }
            $HargaPPN = $grandTotal * 1.10;
            foreach ($dataTransaksi as $transaksi) { $transaksi->update([ 
                'nama_pemesan'        => $request->for_nama_pemesan, 
                'status_bayar'        => $request->for_status_bayar, 
                'metode_bayar'        => $request->for_metode_bayar, 
                'ongkir'              => $request->for_ongkir, 
                'jenis_pesanan'       => $request->for_jenis_pesanan, 
                'nomor_meja'          => $request->for_nomor_meja, 
                'alamat_delivery_order' => $request->for_alamat_delivery_order, 
                'no_hp_customer'        => $request->for_no_hp_customer, 
                'kode_pesanan'        => $kodeGenerate, 
                'total_harga_pesanan' => $grandTotal,
                'ppn'                 => $HargaPPN,
                ]); 
            } 
        TransaksiModel::where('status_cart', 1)->update(['status_cart' => 2]);
        return redirect()->route('list-transaksi-lunas')->with('success', 'Pesanan dibayar');
        }

        function ListTransaksiLunas() {
            $dataMenu = MenuModel::all();
        
            $dataTransaksiLunas = TransaksiModel::selectRaw('MIN(id) as id, kode_pesanan, MAX(nama_pemesan) as nama_pemesan, MAX(nomor_meja) as nomor_meja, MAX(metode_bayar) as metode_bayar, MAX(jenis_pesanan) as jenis_pesanan, MAX(status_bayar) as status_bayar, MAX(total_harga_pesanan) as total_harga_pesanan, MAX(ppn) as ppn, MAX(created_at) as created_at')
            ->where('status_cart', 2)
            ->groupBy('kode_pesanan')
            ->orderBy('created_at', 'DESC')
            ->paginate(15);
            return view('Transaksi/layout-transaksi/list-transaksi', compact('dataTransaksiLunas', 'dataMenu'));
        }
        
        public function PrintNotaTransaksi($id)
        {
            // Cari transaksi spesifik berdasarkan ID
            $dataTransaksi = TransaksiModel::find($id);
            
            // Pastikan data transaksi ditemukan
            if (!$dataTransaksi) {
                return redirect()->back()->with('error', 'Transaksi tidak ditemukan.');
            }
            
            // Ambil semua transaksi dengan 'kode_pesanan' yang sama
            $transaksiSerupa = TransaksiModel::where('kode_pesanan', $dataTransaksi->kode_pesanan)->get();
            
            // Ambil nilai unik untuk kolom ppn dan ongkir
            $uniquePpn = $transaksiSerupa->pluck('ppn')->unique();
            $uniqueOngkir = $transaksiSerupa->pluck('ongkir')->unique();
            $uniqueTotalHargaPesanan =  $transaksiSerupa->pluck('total_harga_pesanan')->unique();
            
            // Mengambil satu nilai unik pertama (asumsi semua nilai sama)
            $totalPpn = $uniquePpn->first();
            $totalHargaPesanan = $uniqueTotalHargaPesanan->first();
            $totalOngkir = $uniqueOngkir->first();
            
            // Menjumlahkan PPN dan ongkir
            $totalBiaya = $totalPpn + $totalOngkir;
            $PPN = $totalPpn - $totalHargaPesanan;
            
            // Mengirim nilai ke view
            return view('Transaksi.layout-transaksi.print-nota', compact('transaksiSerupa', 'totalPpn', 'totalOngkir', 'totalBiaya','PPN'));
        }
        
        public function PrintNotaKitchen($id)
        {
            // Cari transaksi spesifik berdasarkan ID
            $dataTransaksi = TransaksiModel::find($id);
            
            // Ambil semua transaksi dengan 'kode_pesanan' yang sama
            $transaksiSerupa = TransaksiModel::where('kode_pesanan', $dataTransaksi->kode_pesanan)->get();
            
            return view('Transaksi.layout-transaksi.print-nota-kitchen', compact('transaksiSerupa'));
        }    
        
        
        function UpdateStatusTransaksi($id) {
            $dataTransaksi = TransaksiModel::all();
            $dataTransaksiUnique = $dataTransaksi->unique('status_bayar');
            return view('Transaksi.layout-transaksi.list-transaksi-update', compact('dataTransaksi', 'dataTransaksiUnique', 'id'));
        }

        function UpdateMetodeBayar($id){
            $dataTransaksi = TransaksiModel::all();
            $dataTransaksiUnique = $dataTransaksi->unique('metode_bayar');
            return view('Transaksi.layout-transaksi.update-metode-bayar', compact('dataTransaksi', 'dataTransaksiUnique', 'id'));
        }

        function SimpanUpdateMetodeBayar(Request $request, $id){
            $aturan = [
                'for_metode_bayar_name' => 'required'
            ];
        
            $messages = [
                'required' => 'Tidak boleh kosong'
            ];
        
            $validator = Validator::make($request->all(), $aturan, $messages);
            
            if ($validator->fails()) {
                return redirect()
                    ->route('updatemetodebayar', ['id' => $id])
                    ->withErrors($validator)
                    ->withInput();
            } 
        
            try {
                // Temukan transaksi berdasarkan id
                $transaksi = TransaksiModel::find($id);
        
                if ($transaksi) {
                    // Dapatkan kode_pesanan dari transaksi yang ditemukan
                    $kodePesanan = $transaksi->kode_pesanan;
        
                    // Perbarui status_bayar pada semua transaksi dengan kode_pesanan yang sama
                    $update = TransaksiModel::where('kode_pesanan', $kodePesanan)->update([
                        'metode_bayar' => $request->for_metode_bayar_name,
                    ]);
        
                    if ($update) {
                        return redirect()
                            ->route('list-transaksi-lunas', ['id' => $id])
                            ->with('success', 'status bayar updated');
                    } else {
                        return redirect()
                            ->route('updatemetodebayar', ['id' => $id])
                            ->with('danger', 'Failed to update status bayar');
                    }
                } else {
                    return redirect()
                        ->route('updatemetodebayar', ['id' => $id])
                        ->with('danger', 'Transaction not found');
                }
        
            } catch (\Throwable $th) {
                return redirect()
                    ->route('updatemetodebayar', ['id' => $id])
                    ->with('danger', $th->getMessage());
            }
        }
        
        function TransaksiSimpanStatusBayar(Request $request, $id){
            $aturan = [
                'for_status_bayar_name' => 'required'
            ];
        
            $messages = [
                'required' => 'Tidak boleh kosong'
            ];
        
            $validator = Validator::make($request->all(), $aturan, $messages);
            
            if ($validator->fails()) {
                return redirect()
                    ->route('statusListTransaksiUpdate', ['id' => $id])
                    ->withErrors($validator)
                    ->withInput();
            } 
        
            try {
                // Temukan transaksi berdasarkan id
                $transaksi = TransaksiModel::find($id);
        
                if ($transaksi) {
                    // Dapatkan kode_pesanan dari transaksi yang ditemukan
                    $kodePesanan = $transaksi->kode_pesanan;
        
                    // Perbarui status_bayar pada semua transaksi dengan kode_pesanan yang sama
                    $update = TransaksiModel::where('kode_pesanan', $kodePesanan)->update([
                        'status_bayar' => $request->for_status_bayar_name,
                    ]);
        
                    if ($update) {
                        return redirect()
                            ->route('list-transaksi-lunas', ['id' => $id])
                            ->with('success', 'status bayar updated');
                    } else {
                        return redirect()
                            ->route('statusListTransaksiUpdate', ['id' => $id])
                            ->with('danger', 'Failed to update status bayar');
                    }
                } else {
                    return redirect()
                        ->route('statusListTransaksiUpdate', ['id' => $id])
                        ->with('danger', 'Transaction not found');
                }
        
            } catch (\Throwable $th) {
                return redirect()
                    ->route('statusListTransaksiUpdate', ['id' => $id])
                    ->with('danger', $th->getMessage());
            }
        }


        public function TambahTransaksiPadaListTransaksi($kode_pesanan){
            $dataMenu = MenuModel::all();
    
            $dataTransaksiTambah = TransaksiModel::where('kode_pesanan', $kode_pesanan)->where('kode_pesanan', $kode_pesanan)->get();
            // dd($dataTransaksiTambah);
            
            $firstStatusBayar = $dataTransaksiTambah->first() ? $dataTransaksiTambah->first()->status_bayar : null;
        
            return view('Transaksi.layout-transaksi.FormTambahTransaksiPadaListPesanan', compact('dataMenu', 'dataTransaksiTambah', 'firstStatusBayar'));
        }
        

        public function SimpanTransaksiPadaListTransaksi(Request $request, $kode_pesanan) {
            $aturan = [
                'for_pesanan' => 'required'
            ];
        
            $messages = [
                'required' => 'Tidak boleh kosong'
            ];
        
            $validator = Validator::make($request->all(), $aturan, $messages);
        
            if ($validator->fails()) {
                return redirect()->route('TambahPesananPadaListTransaksi', ['kode_pesanan' => $kode_pesanan])
                                 ->withErrors($validator)
                                 ->withInput();
            }
        
            // Ambil metode_bayar dari database sesuai dengan kode_pesanan
            $dataPesanan = TransaksiModel::where('kode_pesanan', $kode_pesanan)->first();
        
            if ($dataPesanan) {
                $data_metode_bayar = $dataPesanan->metode_bayar; // Ambil nilai metode_bayar
                $data_nama_pemesan = $dataPesanan->nama_pemesan;
                $data_ppn          = $dataPesanan->ppn;
                $data_status_cart  = $dataPesanan->status_cart;
                $data_jenis_pesanan  = $dataPesanan->jenis_pesanan;
                $data_nama_kasir  = $dataPesanan->nama_kasir;
                $data_status_bayar = $dataPesanan->status_bayar;
                $data_qty           = $dataPesanan->qty;
                $data_total_harga_pesanan = $dataPesanan->total_harga_pesanan;
                $data_harga_pesanan = $dataPesanan->harga_pesanan;
        
                DB::beginTransaction(); // Mulai transaksi database
        
                try {
                    $total = $request->for_harga * $request->for_qty;
                    $tambahanPesanan = $request->for_qty * $request->for_harga;
                    $update_total_harga_pesanan = $data_total_harga_pesanan + $tambahanPesanan;
                    $update_ppn = $update_total_harga_pesanan * 1.10;
                    // Insert data baru ke tabel TransaksiModel
                    
                    $insert = TransaksiModel::create([
                        'kode_pesanan'      => $kode_pesanan,
                        'pesanan'           => $request->for_pesanan_user,
                        'harga_pesanan'     => $request->for_harga,
                        'qty'               => $request->for_qty,
                        'jenis_pesanan'     => $data_jenis_pesanan,
                        'nama_kasir'        => $data_nama_kasir,
                        'status_bayar'      => $data_status_bayar,
                        'total_harga_pesanan' => $data_total_harga_pesanan,
                        'ppn'               => $data_ppn,
                        'status_cart'       => $data_status_cart,
                        'metode_bayar'      => $data_metode_bayar, // Masukkan nilai metode_bayar ke data yang akan disimpan
                        'nama_pemesan'      => $data_nama_pemesan, // Masukkan nilai metode_bayar ke data yang akan disimpan
                        'harga_pesanan_plus_qty' => $request->for_qty*$request->for_harga,
                    ]);
        
                      // Update nilai kolom ppn untuk semua baris dengan kode_pesanan yang sama
                      TransaksiModel::where('kode_pesanan', $kode_pesanan)
                      ->update([
                       'total_harga_pesanan' => $update_total_harga_pesanan,
                       'ppn'                 => $update_ppn,
                        ]);
        
                    DB::commit(); // Selesaikan transaksi database
        
                    if ($insert) {
                        return redirect()->route('TambahPesananPadaListTransaksi', ['kode_pesanan' => $kode_pesanan])
                                         ->with('success', 'Tambah pesanan yang sudah ada berhasil');
                    }
        
                } catch (\Throwable $th) {
                    DB::rollBack(); // Batalkan transaksi jika terjadi kesalahan
                    return redirect()->route('TambahPesananPadaListTransaksi', ['kode_pesanan' => $kode_pesanan])
                                     ->with('danger', $th->getMessage());
                }
            } else {
                return redirect()->route('TambahPesananPadaListTransaksi', ['kode_pesanan' => $kode_pesanan])
                                 ->with('danger', 'Kode pesanan tidak ditemukan.');
            }
        }
        
        function VoidView($kode_pesanan){
            $ListTransaksi = TransaksiModel::where('kode_pesanan', $kode_pesanan)->get();
            return view('Transaksi/VoidView/VoidView',compact('ListTransaksi'));
        }

      function VoidDelete($id){
    try {
        // Ambil data transaksi berdasarkan id
        $transaksi = TransaksiModel::findOrFail($id);
        $kodePesanan = $transaksi->kode_pesanan; // Simpan kode pesanan untuk update nanti
        $PesananYangDiVoid = $transaksi->pesanan; // pesanan yang di void

        // Menghapus transaksi
        $delete = $transaksi->delete();

        if ($delete) {
            // Hitung total harga baru berdasarkan semua transaksi yang memiliki kode pesanan yang sama
            $totalHargaBaru = TransaksiModel::where('kode_pesanan', $kodePesanan)
                ->sum('harga_pesanan_plus_qty'); // Menjumlahkan semua harga pesanan tersisa

            // Hitung PPN (10% dari total harga baru)
            $ppnBaru = $totalHargaBaru * 1.10;

            // Update `total_harga_pesanan` dan `ppn` pada semua transaksi yang memiliki kode pesanan yang sama
            TransaksiModel::where('kode_pesanan', $kodePesanan)->update([
                'total_harga_pesanan' => $totalHargaBaru,
                'ppn' => $ppnBaru
            ]);

            return redirect()
                ->route('list-transaksi-lunas')
                ->with('success', $PesananYangDiVoid . 'Pesanan berhasil di void');
        }

        } catch (\Throwable $th) {
            return redirect()
                ->route('list-transaksi-lunas')
                ->with('danger', $th->getMessage());
        }
    }
}
    






