<?php

namespace App\Http\Controllers\Kasir;

use App\Http\Controllers\Controller;
use App\Models\BukuBesar;
use App\Models\DetailPesanan;
use App\Models\KelompokKategori;
use App\Models\Pesanan;
use App\Models\Produk;
use App\Models\RekeningCoa;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class Transaksi extends Controller
{

    function __construct()
    {
        Carbon::setLocale('id_ID');
    }

    public function index()
    {
        // count pesanan by date now and add 1 for next count pesanan today
        $lastCountPesanan = Pesanan::whereDate('created_at', date('Y-m-d'))->count() + 1;
        // add 0 in front of lastCountPesanan if lastCountPesanan less than 10
        $lastCountPesanan = str_pad($lastCountPesanan, 2, '0', STR_PAD_LEFT);
        $orderCode =  "ORD-" . date('ym') . strtoupper(random_str(3, random_str())) . date('d')  . '-' . $lastCountPesanan;
        $KelompokKategori = KelompokKategori::with('kelompokKategoriPivot.produk')->get();
        $aba = RekeningCoa::where('kode_coa', 1)->where('sub_kode_coa', 200)->get();

        // dd($KelompokKategori);

        // Set locale Jakarta (ID) untuk Carbon
        // Carbon::setLocale('id_ID');
        // Sekarang Carbon akan menggunakan format dan pengaturan waktu yang sesuai dengan locale Jakarta
        // $tgl_sekarang = Carbon::now();

        // $allProduk = [];
        // $produk = Produk::where('tgl_start_promo', '<=', $tgl_sekarang)->where('tgl_end_promo', '>=', $tgl_sekarang)->get();

        return view('pages.Kasir.transaksi', compact('orderCode', 'KelompokKategori', 'aba'));
    }

    public function getCetakTigaKali()
    {
        $data = Pesanan::with(['detailPesanan', 'user'])->where('status_printer', null)->get();
        $nomor = 1;

        return $datatables = datatables()
            ->of($data)
            ->addColumn('nomor', function ($data) use (&$nomor) {
                return $nomor++;
            })
            ->addColumn('nama_user', function ($data) {
                return $data->user->name;
            })
            ->addColumn('created_at', function ($data) {
                return \Carbon\Carbon::parse($data->created_at)->format('d F Y H:i:s');
            })
            ->addColumn('grand_total', function ($data) {
                return 'Rp ' . number_format($data->grand_total, 0, ',', '.');
            })
            ->addColumn('ubah', function ($data) {
                return '<div class="btn-group">
                            <a href="javascript:void(0)" class="mx-1" onclick="printDapurTigaKali(\'' . $data->id . '\')"><span class="btn btn-xs btn-success"><i class="fas fa-print"></i> 3x </span></a>
                            <a href="javascript:void(0)" class="mx-1" onclick="printDapurDuaKali(\'' . $data->id . '\')"><span class="btn btn-xs btn-success"><i class="fas fa-print"></i> 2x </span></a>
                            <a href="javascript:void(0)" class="mx-1" onclick="printDapurSatuKali(\'' . $data->id . '\')"><span class="btn btn-xs btn-success"><i class="fas fa-print"></i> 1x </span></a>
                        </div>';
            })
            ->rawColumns(['nomor', 'nama_user', 'created_at', 'grand_total', 'ubah'])
            ->make(true);
    }

    public function printDapurTigaKali($id)
    {
        $pesanan = \App\Models\Pesanan::with('detailPesanan', 'user')->find($id);
        $data = Pesanan::where('id', $id);
        $data->update([
            'status_printer'    => 1
        ]);

        return view('pages.Kasir.print_dapur_3x', compact('pesanan'));
    }

    public function printDapurDuaKali($id)
    {
        $pesanan = \App\Models\Pesanan::with('detailPesanan', 'user')->find($id);
        $data = Pesanan::where('id', $id);
        $data->update([
            'status_printer'    => 1
        ]);

        return view('pages.Kasir.print_dapur_2x', compact('pesanan'));
    }

    public function printDapurSatuKali($id)
    {
        $pesanan = \App\Models\Pesanan::with('detailPesanan', 'user')->find($id);
        $data = Pesanan::where('id', $id);
        $data->update([
            'status_printer'    => 1
        ]);

        return view('pages.Kasir.print_dapur', compact('pesanan'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'orderCode' => 'required',
            'namaPemesan' => 'required',
            'nomorMeja' => 'required',
            'orderMenus' => 'required',
        ], [
            'orderCode.required' => 'Kode pesanan tidak boleh kosong',
            'namaPemesan.required' => 'Nama pemesan tidak boleh kosong',
            'nomorMeja.required' => 'Nomor meja tidak boleh kosong',
            'orderMenus.required' => 'Pesanan tidak boleh kosong',
        ]);

        $user = request()->user();

        try {
            DB::beginTransaction();

            $orderMenusQty = 0;
            $orderMenusRupiah = 0;
            foreach ($request->orderMenus as $key => $value) {
                $orderMenusQty += $value['qty'];
                $orderMenusRupiah += $value['total'];
            }
            // $ get last count pesanan by date now and add 1 for next count pesanan today
            $lastCountPesanan = Pesanan::whereDate('created_at', date('Y-m-d'))->count() + 1;
            // calculate nomor antrian
            $nomorAntrian = $lastCountPesanan;

            $kodenya = substr($request->orderCode, 0, -3); // Menghapus tiga karakter terakhir,

            // check antrian pesanan jika sudah ada di database maka tambahkan 1 untuk nomor antrian selanjutnya
            $lastCountPesanan = Pesanan::whereDate('created_at', date('Y-m-d'))->count() + 1;

            $kodenya = $kodenya . '-' . $lastCountPesanan;

            if ($request->jenis_pembayaran == "1") {
                $pesananDatas = [
                    'kode_pesanan' => $kodenya,
                    'nama_pemesan' => $request->namaPemesan,
                    'nomor_pemesan' => $request->nomorPemesan,
                    'nomor_meja' => $request->nomorMeja,
                    'status_pesanan' => '1',
                    'tanggal_pesanan' => date('Y-m-d H:i:s'),
                    'keterangan_pesanan' => $request->keteranganPesanan ?? null,
                    'nomor_antrian' => $nomorAntrian,
                    'total_pesanan' => $orderMenusQty,
                    'total_bayar' => $orderMenusRupiah,
                    'grand_total' => $request->totalDiskon,
                    'nominal_bayar' => $request->nominalBayar,
                    'diskon_persen' => $request->diskon,
                    'nominal_kembali' => $request->kembali,
                    'status_bayar' => '1',
                    'user_id' => $user->id,
                    'jenis_pembayaran' => $request->jenis_pembayaran,
                ];
                $pesananModels = \App\Models\Pesanan::create($pesananDatas);
            } else {
                $pesananDatas = [
                    'kode_pesanan' => $kodenya,
                    'nama_pemesan' => $request->namaPemesan,
                    'nomor_pemesan' => $request->nomorPemesan,
                    'nomor_meja' => $request->nomorMeja,
                    'status_pesanan' => '1',
                    'tanggal_pesanan' => date('Y-m-d H:i:s'),
                    'keterangan_pesanan' => $request->keteranganPesanan ?? null,
                    'nomor_antrian' => $nomorAntrian,
                    'total_pesanan' => $orderMenusQty,
                    'total_bayar' => $orderMenusRupiah,
                    'grand_total' => $request->totalDiskon,
                    'nominal_bayar' => $request->totalDiskon,
                    'diskon_persen' => $request->diskon,
                    'nominal_kembali' => 0,
                    'status_bayar' => '1',
                    'user_id' => $user->id,
                    'jenis_pembayaran' => $request->jenis_pembayaran,
                    'rekening_coa_id' => $request->id_rekening_coa,
                ];
                $pesananModels = \App\Models\Pesanan::create($pesananDatas);
            }

            foreach ($request->orderMenus as $key => $value) {
                // calculate produk promo untuk mengurangi stok
                $produk = Produk::find($value['id']);

                foreach ($produk->kelompokKategori as $key => $value2) {
                    if ($value2->kode_kelompok_kategori == 'PROMO') {
                        if ($produk->stok_promo != 0 || $produk->stok_promo != null) {
                            $produk->stok_promo = $produk->stok_promo - $value['qty'];
                            $produk->save();
                        }
                    }
                }

                $oderDatas = [
                    'pesanan_id' => $pesananModels->id,
                    'produk_id' => $value['id'],
                    'nama_produk' => $value['nama'],
                    'jumlah_produk' => $value['qty'],
                    'harga_produk' => $value['harga'],
                    'total_harga_produk' => $value['total'],
                    'diskon_persen' => $value['diskonSatuan'] ?? null,
                    'keterangan_produk' => $value['keterangan'] ?? null,
                    'status_pesanan' => $value['status_pesanan_dinein'] ?? null,
                ];
                $detailPesananModels = \App\Models\DetailPesanan::create($oderDatas);
            }

            // keuangan
            // jika pembayaran non tunai
            if ($request->jenis_pembayaran == "2") {
                BukuBesar::create([
                    'faktur'    => 'PJ-' . date('YmdHis'),
                    'tanggal'   => date('Y-m-d'),
                    'rekening_coa_id'   => $request->id_rekening_coa,
                    'pesanans_id'       => $pesananModels->id,
                    'kode_rekening_coa' => $request->kode_coa,
                    'keterangan_coa'    => $request->keterangan_coa,
                    'keterangan'        => 'Penjualan Non Tunai[' . $kodenya . ']',
                    'debet'     => $request->totalDiskon,
                    'kredit'    => 0
                ]);
                BukuBesar::create([
                    'faktur'    => 'PJ-' . date('YmdHis'),
                    'tanggal'   => date('Y-m-d'),
                    'rekening_coa_id'   => "35",
                    'pesanans_id'       => $pesananModels->id,
                    'kode_rekening_coa' => "4.100.01",
                    'keterangan_coa'    => "Pendapatan Penjualan",
                    'keterangan'        => 'Penjualan Non Tunai[' . $kodenya . ']',
                    'debet'     => 0,
                    'kredit'    => $request->totalDiskon
                ]);
                // jika pembayaran tunai
            } else {
                BukuBesar::create([
                    'faktur'    => 'PJ-' . date('YmdHis'),
                    'tanggal'   => date('Y-m-d'),
                    'rekening_coa_id'   => "2",
                    'pesanans_id'       => $pesananModels->id,
                    'kode_rekening_coa' => "1.100.01",
                    'keterangan_coa'    => "Kas Kasir",
                    'keterangan'        => 'Penjualan Tunai[' . $kodenya . ']',
                    'debet'     => $request->totalDiskon,
                    'kredit'    => 0
                ]);
                BukuBesar::create([
                    'faktur'    => 'PJ-' . date('YmdHis'),
                    'tanggal'   => date('Y-m-d'),
                    'rekening_coa_id'   => "35",
                    'pesanans_id'       => $pesananModels->id,
                    'kode_rekening_coa' => "4.100.01",
                    'keterangan_coa'    => "Pendapatan Penjualan",
                    'keterangan'        => 'Penjualan Tunai[' . $kodenya . ']',
                    'debet'     => 0,
                    'kredit'    => $request->totalDiskon
                ]);
            }

            DB::commit();
            // return url link page print
            return ['url' => route('transaksi.print', $pesananModels->id)  . '?print=true', 'message' => 'Pesanan berhasil ditambahkan'];
        } catch (\Throwable $th) {
            DB::rollBack();
            dd($th->getMessage());
            return redirect()->back()->with('error', 'Terjadi kesalahan');
        }

        return redirect()->back()->with('success', 'Pesanan berhasil ditambahkan');
    }

    public function print($id)
    {
        $pesanan = \App\Models\Pesanan::with('detailPesanan', 'user')->find($id);
        return view('pages.Kasir.print', compact('pesanan'));
    }

    public function detail($id)
    {
        $pesanan = \App\Models\Pesanan::with('detailPesanan', 'user')->find($id);
        return view('pages.Kasir.detail', compact('pesanan'));
    }

    public function selectPaket(Request $request)
    {
        $arrayKodeProduk = $request->kodeProduk;
        // tampung data kodeProduk dari request ke variabel $kodeProduk
        $kodeProduk = [];

        usort($arrayKodeProduk, function ($a, $b) {
            return $a['urutan'] - $b['urutan'];
        });

        foreach ($arrayKodeProduk as $key => $value) {
            $kodeProduk[] = $value['kode_produk'];
        }
        $hasil = [];
        $hasil[] = implode(' ', $kodeProduk);

        // cari data produk berdasarkan kodeProduk
        $produk = Produk::where('kode_produk', $hasil)->first();
        // dd($produk);
        return response()->json($produk);
    }
}