<?php

namespace App\Http\Controllers\Admins\Penjualan;

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

class PenjualanController extends Controller
{
    public function index()
    {
        $aba = RekeningCoa::where('kode_coa', 1)->where('sub_kode_coa', 200)->get();

        return view('pages.admin.penjualan.index', compact('aba'));
    }

    public function getDataPenjualan(Request $request)
    {
        $nomor = 1;
        $filter_tanggal_1 = $request->filter_tanggal_1;
        $filter_tanggal_2 = $request->filter_tanggal_2;
        $akun_coa = $request->akun_coa;
        if ($request->akun_coa == null) {
            $data = Pesanan::with(['detailPesanan', 'user'])
                ->when($filter_tanggal_1, function ($query) use ($filter_tanggal_1) {
                    return $query->whereDate('tanggal_pesanan', '>=', $filter_tanggal_1);
                })
                ->when($filter_tanggal_2, function ($query) use ($filter_tanggal_2) {
                    return $query->whereDate('tanggal_pesanan', '<=', $filter_tanggal_2);
                })
                ->when(!$filter_tanggal_1 && !$filter_tanggal_2, function ($query) {
                    return $query->whereDate('tanggal_pesanan', Carbon::today());
                })
                ->orderBy('tanggal_pesanan', 'desc')
                ->get();
        } else {
            $data = Pesanan::with(['detailPesanan', 'user', 'rekening_coa'])
                ->where('rekening_coa_id', $akun_coa)
                ->when($filter_tanggal_1, function ($query) use ($filter_tanggal_1) {
                    return $query->whereDate('tanggal_pesanan', '>=', $filter_tanggal_1);
                })
                ->when($filter_tanggal_2, function ($query) use ($filter_tanggal_2) {
                    return $query->whereDate('tanggal_pesanan', '<=', $filter_tanggal_2);
                })
                ->when(!$filter_tanggal_1 && !$filter_tanggal_2, function ($query) {
                    return $query->whereDate('tanggal_pesanan', Carbon::today());
                })
                ->orderBy('tanggal_pesanan', 'desc')
                ->get();
        }

        return datatables()
            ->of($data)
            ->addColumn('nomor', function ($data) use (&$nomor) {
                return $nomor++;
            })
            ->addColumn('nama_pemesan', function ($data) {
                $nomor = $data->nomor_pemesan != null ? '(' . $data->nomor_pemesan . ')' : '';
                return $data->nama_pemesan . ' ' . $nomor;
            })
            ->addColumn('nomor_meja', function ($data) {
                return $data->nomor_meja != null ? $data->nomor_meja : '-';
            })
            ->addColumn('created_at', function ($data) {
                return \Carbon\Carbon::parse($data->created_at)->format('d F Y H:i:s');
            })
            ->addColumn('total_bayar_rp', function ($data) {
                return 'Rp ' . number_format($data->total_bayar, 0, ',', '.');
            })
            ->addColumn('grand_total_rp', function ($data) {
                return 'Rp ' . number_format($data->grand_total, 0, ',', '.');
            })
            ->addColumn('jenis_pembayarannya', function ($data) {
                return $data->jenis_pembayaran == 1 ? 'Tunai' : ($data->jenis_pembayaran == null ? 'Tunai' : 'Non-Tunai' . ' (' . ($data->rekening_coa?->keterangan_coa ?? '') . ')');
            })
            ->addColumn('ubah', function ($data) {
                return '<div class="btn-group">
                    <a class="btn btn-xs btn-warning mr-1" href="javascript:void(0)" onclick="detail(\'' . $data->id . '\')"><i class="fas fa-eye"></i></a>
                    <a class="btn btn-xs btn-success" href="javascript:void(0)" onclick="print(\'' . $data->id . '\')"><i class="fas fa-print"></i></a></div>';
            })
            ->rawColumns(['nomor', 'nama_user', 'created_at', 'grand_total', 'ubah'])
            ->make(true);
    }

    public function print($id)
    {
        $pesanan = \App\Models\Pesanan::with('detailPesanan', 'user')->find($id);

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

    public function getDataDetailPenjualan(Request $request)
    {
        $data = DetailPesanan::with('pesanan')->where('pesanan_id', $request->id_pesanan)->withTrashed()->get();
        $pesanan = Pesanan::find($request->id_pesanan);
        return response()->json(['status' => true, 'data' => $data, 'pesanan' => $pesanan]);
    }

    public function laporan(Request $request)
    {
        try {
            $mpdf = new \Mpdf\Mpdf([
                'mode' => 'utf-8',
                'format' => 'A4',
                'orientation' => 'portrait',
                'margin_left' => 15,
                'margin_right' => 15,
                'margin_top' => 10,
                'margin_bottom' => 10,
                'default_font_size' => 9,
                'default_font' => 'arial',
            ]);
            $mpdf->AddPage();
            $mpdf->setFooter('{PAGENO}');

            $filter_tanggal_1 = $request->filter_tanggal_1;
            $filter_tanggal_2 = $request->filter_tanggal_2;
            if ($request->jenis_coa == null) {
                $keterangan_coa = 'Semua';
                $data = Pesanan::with(['user', 'bukuBesar', 'rekening_coa'])->whereDate('tanggal_pesanan', '>=', $request->filter_tanggal_1)
                    ->whereDate('tanggal_pesanan', '<=', $request->filter_tanggal_2)
                    ->get();
            } else {
                $keterangan_coa = RekeningCoa::find($request->jenis_coa)->keterangan_coa;
                $data = Pesanan::with(['user', 'bukuBesar', 'rekening_coa'])->where('rekening_coa_id', $request->jenis_coa)->whereDate('tanggal_pesanan', '>=', $request->filter_tanggal_1)
                    ->whereDate('tanggal_pesanan', '<=', $request->filter_tanggal_2)
                    ->get();
            }

            $alldata = [
                'data' => $data,
                'filter_tanggal_1' => $filter_tanggal_1,
                'filter_tanggal_2' => $filter_tanggal_2,
                'keterangan_coa' => $keterangan_coa
            ];

            $html = view('pages.admin.penjualan.laporan', $alldata);
            // $html->render();
            // $mpdf->WriteHTML($html);

            // $mpdf->chunkLoadView('<html-separator/>', 'pages.admin.penjualan.laporan', $alldata);
            // return $mpdf->stream('document.pdf');

            $chunks = explode("chunk", (string)$html);
            foreach ($chunks as $key => $val) {
                // $mpdf->WriteHTML($val);
            }
            $mpdf->writeHTML($html);

            $mpdf->Output('Laporan_Penjualan.pdf', 'I');
            return response()->header('Content-Type', 'application/pdf');
        } catch (\Throwable $th) {
            Session::flash('errors', 'Gagal membuat laporan, coba lagi dengan rentang tanggal yang lebih pendek');
            return redirect()->back();
            //throw $th;
        }
    }

    public function cancel(Request $request)
    {
        try {

            DB::beginTransaction();
            $pesanan = Pesanan::find($request->id);
            $pesanan->status_pesanan = 3;
            // delete detail pesanan
            $pesanan->detailPesanan()->delete();
            $pesanan->delete();
            $pesanan->save();

            DB::commit();
            return response()->json(['status' => true, 'message' => 'Pesanan berhasil di cancel']);
        } catch (\Throwable $th) {
            DB::rollBack();
            return response()->json(['status' => false, 'message' => 'Pesanan gagal di cancel']);
            //throw $th;
        }
    }

    public function cancelDetail(Request $request)
    {
        try {

            DB::beginTransaction();
            $detailPesanan = DetailPesanan::find($request->id);

            $pesanan = Pesanan::find($detailPesanan->pesanan_id);
            $pesanan->total_bayar = $pesanan->total_bayar - $detailPesanan->total_harga_produk;
            // check the diskon in pesanan
            $pesanan->grand_total = $pesanan->total_bayar - $pesanan->diskon_rupiah;
            $pesanan->total_pesanan = $pesanan->total_pesanan - $detailPesanan->jumlah_produk;
            $pesanan->save();

            $detailPesanan->status_pesanan = '3';
            $detailPesanan->delete();
            $detailPesanan->save();

            DB::commit();
            return response()->json(['status' => true, 'message' => 'Pesanan berhasil di cancel']);
        } catch (\Throwable $th) {
            DB::rollBack();
            return response()->json(['status' => false, 'message' => 'Pesanan gagal di cancel']);
            //throw $th;
        }
    }

    public function dibatalkan()
    {
        if (request()->ajax()) {
            $data = Pesanan::with(['detailPesanan', 'user'])
                ->where('status_pesanan', 3)
                ->orderBy('tanggal_pesanan', 'desc')
                ->withTrashed()
                ->get();

            return datatables()
                ->of($data)
                ->addIndexColumn()
                ->addColumn('nama_pemesan', function ($data) {
                    $nomor = $data->nomor_pemesan != null ? '(' . $data->nomor_pemesan . ')' : '';
                    return $data->nama_pemesan . ' ' . $nomor;
                })
                ->addColumn('nomor_meja', function ($data) {
                    return $data->nomor_meja != null ? $data->nomor_meja : '-';
                })
                ->addColumn('created_at', function ($data) {
                    return \Carbon\Carbon::parse($data->created_at)->format('d F Y H:i:s');
                })
                ->addColumn('total_bayar_rp', function ($data) {
                    return 'Rp ' . number_format($data->total_bayar, 0, ',', '.');
                })
                ->addColumn('grand_total_rp', function ($data) {
                    return 'Rp ' . number_format($data->grand_total, 0, ',', '.');
                })
                ->addColumn('ubah', function ($data) {
                    return '<div class="btn-group">
                    <a href="javascript:void(0)" onclick="detail(\'' . $data->id . '\')"><span class="btn btn-xs btn-warning mr-1"><i class="fas fa-eye"></i></span></a>
                    <a href="javascript:void(0)" onclick="print(\'' . $data->id . '\')"><span class="btn btn-xs btn-success"><i class="fas fa-print"></i></span></a></div>';
                })
                ->rawColumns(['nomor', 'nama_user', 'created_at', 'grand_total', 'ubah'])
                ->make(true);
        }
        return view('pages.admin.penjualan.dibatalkan');
    }
}