<?php

namespace App\Http\Controllers\Kasir;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Zelda\EscposPhp\EscposImage;
use Zelda\EscposPhp\PrintConnectors\NetworkPrintConnector;
use Zelda\EscposPhp\PrintConnectors\WindowsPrintConnector;
use Zelda\EscposPhp\Printer;

// jumlah character yang bisa ditampung oleh printer 88mm adalah 48 karakter per baris tapi yang dipakai hanya 46 atau 42 saja
class kolomPrinter88mmController extends Controller
{
    public function print88mm($pesanan, $printernya)
    {
        // begin set data
        $items = [];
        /* Information for the receipt */
        foreach ($pesanan->detailPesanan as $key => $value) {

            $theDiskon =  $value->diskon_persen != '' || $value->diskon_persen != 0 || $value->diskon_persen != null ? $value->diskon_persen . '%' : '';
            $items[] =  $this->buatBaris1Kolom($value->nama_produk);
            // $items[] =  new itemReceipt($value->jumlah_produk . '        Rp. ' . format_uang($value->harga_produk) . '        ' . $theDiskon, 'Rp. ' . format_uang($value->total_harga_produk));
            $items[] =  $this->buatBaris4Kolom($value->jumlah_produk, 'Rp. ' . format_uang($value->harga_produk), $theDiskon, 'Rp. ' . format_uang($value->total_harga_produk));
        }

        // $images = EscposImage::load(env('PATH_LOGO_STK'), false);
        $stk = "Martabak Hawaii\n";
        $address = "Jln. Jawa No. 28A, Jember\n";
        $dashline = "                                              \n";
        $ordercode = $pesanan->kode_pesanan . "\n";
        $line1 = $this->buatBaris2Kolom('Meja: ' . $pesanan->nomor_meja, '  Kasir:');
        $line2 = $this->buatBaris2Kolom('Antrian: ' . $pesanan->nomor_antrian, $pesanan->user->name . 'ssssss');
        $line3 = $this->buatBaris1Kolom('Pemesan: ' . $pesanan->nama_pemesan);

        $total = $this->buatBaris3Kolom($pesanan->total_pesanan, 'Total: ', 'Rp. ' . format_uang($pesanan->total_bayar));
        $theDiskonAll =  $pesanan->diskon_persen != '' || $pesanan->diskon_persen != 0 || $pesanan->diskon_persen != null ? $pesanan->diskon_persen . '%' : '0%';
        $diskon = $this->buatBaris3Kolom('', 'Diskon: ', $theDiskonAll);
        $rpgrand_total = 'Rp. ' . format_uang($pesanan->grand_total);
        $grand_Total = $this->buatBaris3Kolom('', 'Grand Total: ', $rpgrand_total);
        $bayar = $this->buatBaris3Kolom('', 'Bayar: ', 'Rp. ' . format_uang($pesanan->nominal_bayar));
        $kembali = $this->buatBaris3Kolom('', 'Kembali: ', 'Rp. ' . format_uang($pesanan->nominal_kembali));
        $terimakasih = "Terima Kasih, Selamat Datang Kembali\n";
        $stkfooter = "@sepiringtelurkeriting";
        /* Date is kept the same for testing */
        $date = tanggal_indonesia($pesanan->tanggal_pesanan) . date('H:i', strtotime($pesanan->tanggal_pesanan));
        // end set data

        // begin print action
        /* Fill in your own connector here */
        $connector = null;
        if ($printernya->printer_connection == 'wired') {
            $connector = new WindowsPrintConnector($printernya->nama_printer);
            $connector->finalize();
        } else {
            $connector = new NetworkPrintConnector($printernya->ip_address, 9100);
        }

        /* Start the printer */
        $printer = new Printer($connector);

        /* Print top logo */
        $printer->setJustification(Printer::JUSTIFY_CENTER);

        /* Name of shop */
        // $printer->bitImage($images);
        $printer->selectPrintMode(Printer::MODE_DOUBLE_WIDTH);
        $printer->text($stk);
        $printer->selectPrintMode();
        $printer->text($address);
        $printer->setUnderline(Printer::UNDERLINE_DOUBLE);
        $printer->text($dashline);
        $printer->selectPrintMode();

        /* Title of receipt */
        $printer->setEmphasis(true);
        $printer->selectPrintMode(Printer::MODE_DOUBLE_WIDTH);
        $printer->text($ordercode);
        $printer->selectPrintMode();
        $printer->text($date . "\n");
        $printer->setEmphasis(false);

        $printer->setJustification(Printer::JUSTIFY_LEFT);

        $printer->text($line1);
        $printer->text($line2);
        $printer->text($line3);

        /* Items */
        $printer->setJustification(Printer::JUSTIFY_LEFT);
        $printer->setEmphasis(true);

        $printer->setJustification(Printer::JUSTIFY_CENTER);
        $printer->setUnderline(Printer::UNDERLINE_DOUBLE);
        $printer->text($dashline);
        $printer->selectPrintMode();
        $printer->setJustification(Printer::JUSTIFY_LEFT);

        $printer->setEmphasis(false);
        foreach ($items as $item) {
            $printer->text($item);
        }

        $printer->setJustification(Printer::JUSTIFY_CENTER);
        $printer->setUnderline(Printer::UNDERLINE_DOUBLE);
        $printer->text($dashline);
        $printer->selectPrintMode();
        $printer->setJustification(Printer::JUSTIFY_LEFT);

        // $printer->text($totalItem);
        $printer->text($total);
        $printer->text($diskon);
        $printer->text($grand_Total);
        $printer->text($bayar);
        $printer->text($kembali);

        $printer->setJustification(Printer::JUSTIFY_CENTER);
        $printer->setUnderline(Printer::UNDERLINE_DOUBLE);
        $printer->text($dashline);
        $printer->selectPrintMode();
        $printer->setJustification(Printer::JUSTIFY_LEFT);

        /* Footer */
        $printer->setJustification(Printer::JUSTIFY_CENTER);
        $printer->text($terimakasih);
        $printer->text($stkfooter);
        $printer->feed();

        /* Cut the receipt and open the cash drawer */
        $printer->cut();
        $printer->pulse();

        $printer->close();
        // end print action
        return true;
    }

    public function print88mmDapur($pesanan, $printernya)
    {
        // begin set data
        $items = [];
        /* Information for the receipt */
        foreach ($pesanan->detailPesanan as $key => $value) {
            $status_pesanan = $value->status_pesanan == 0 ? '(TAKEAWAY)' : ($value->status_pesanan == 3 ? '(CANCEL)' : '');
            if ($value->keterangan_produk != '') {
                $items[] =  $this->buatBaris1Kolom('(' . $value->jumlah_produk . ')  ' . $value->nama_produk . '  ' . $status_pesanan);
                $items[] =  $this->buatBaris1Kolom('Ket: ' . $value->keterangan_produk . "\n");
            } else {
                $items[] =  $this->buatBaris1Kolom('(' . $value->jumlah_produk . ')  ' . $value->nama_produk . '  ' . $status_pesanan . "\n");
            }
        }

        $stk = "Martabak Hawaii\n";
        $address = "Jln. Jawa No. 28A, Jember\n";
        $dashline = "                                              \n";
        $ordercode = $pesanan->kode_pesanan . "\n";
        $line1 = $this->buatBaris2Kolom('Meja: ' . $pesanan->nomor_meja, '  Kasir:');
        $line2 = $this->buatBaris2Kolom('Antrian: ' . $pesanan->nomor_antrian, $pesanan->user->name . 'ssssss');
        $line3 = $this->buatBaris1Kolom('Pemesan: ' . $pesanan->nama_pemesan);
        $total_pesanan = $this->buatBaris1Kolom($pesanan->total_pesanan . ' Total item');
        $keterangan_seluruh = $this->buatBaris1Kolom('Keterangan Pesan Keseluruhan:');
        $keterangan_pesanannya = $this->buatBaris1Kolom($pesanan->keterangan_pesanan);
        /* Date is kept the same for testing */
        $date = tanggal_indonesia($pesanan->tanggal_pesanan) . date('H:i', strtotime($pesanan->tanggal_pesanan));
        // end set data

        // begin print action
        /* Fill in your own connector here */
        $connector = null;
        if ($printernya->printer_connection == 'wired') {
            $connector = new WindowsPrintConnector($printernya->nama_printer);
        } else {
            $connector = new NetworkPrintConnector($printernya->ip_address, 9100);
        }
        /* Start the printer */
        $printer = new Printer($connector);

        /* Print top logo */
        $printer->setJustification(Printer::JUSTIFY_CENTER);

        /* Name of shop */
        $printer->selectPrintMode(Printer::MODE_DOUBLE_WIDTH);
        $printer->text($stk);
        $printer->selectPrintMode();
        $printer->text($address);
        $printer->setUnderline(Printer::UNDERLINE_DOUBLE);
        $printer->text($dashline);
        $printer->selectPrintMode();

        /* Title of receipt */
        $printer->setEmphasis(true);
        $printer->text($ordercode);
        $printer->text($date . "\n");
        $printer->setEmphasis(false);

        $printer->setJustification(Printer::JUSTIFY_LEFT);

        $printer->text($line1);
        $printer->text($line2);
        $printer->text($line3);

        /* Items */
        $printer->setJustification(Printer::JUSTIFY_LEFT);
        $printer->setEmphasis(true);

        $printer->setJustification(Printer::JUSTIFY_CENTER);
        $printer->setUnderline(Printer::UNDERLINE_DOUBLE);
        $printer->text($dashline);
        $printer->selectPrintMode();
        $printer->setJustification(Printer::JUSTIFY_LEFT);

        $printer->setEmphasis(false);
        foreach ($items as $item) {
            $printer->text($item);
        }

        $printer->setJustification(Printer::JUSTIFY_CENTER);
        $printer->setUnderline(Printer::UNDERLINE_DOUBLE);
        $printer->text($dashline);
        $printer->selectPrintMode();
        $printer->setJustification(Printer::JUSTIFY_LEFT);

        $printer->text($total_pesanan);
        $printer->text($keterangan_seluruh);
        $printer->text($keterangan_pesanannya);

        $printer->setJustification(Printer::JUSTIFY_CENTER);
        $printer->setUnderline(Printer::UNDERLINE_DOUBLE);
        $printer->text($dashline);
        $printer->selectPrintMode();
        $printer->setJustification(Printer::JUSTIFY_LEFT);

        /* Footer */
        $printer->feed();

        /* Cut the receipt and open the cash drawer */
        $printer->cut();
        $printer->pulse();

        $printer->close();
        // end print action
        return true;
    }

    function buatBaris1Kolom($kolom1)
    {
        // Mengatur lebar setiap kolom (dalam satuan karakter)
        $lebar_kolom_1 = 46;

        // Melakukan wordwrap(), jadi jika karakter teks melebihi lebar kolom, ditambahkan \n
        $kolom1 = wordwrap($kolom1, $lebar_kolom_1, "\n", true);

        // Merubah hasil wordwrap menjadi array, kolom yang memiliki 2 index array berarti memiliki 2 baris (kena wordwrap)
        $kolom1Array = explode("\n", $kolom1);

        // Mengambil jumlah baris terbanyak dari kolom-kolom untuk dijadikan titik akhir perulangan
        $jmlBarisTerbanyak = count($kolom1Array);

        // Mendeklarasikan variabel untuk menampung kolom yang sudah di edit
        $hasilBaris = array();

        // Melakukan perulangan setiap baris (yang dibentuk wordwrap), untuk menggabungkan setiap kolom menjadi 1 baris
        for ($i = 0; $i < $jmlBarisTerbanyak; $i++) {

            // memberikan spasi di setiap cell berdasarkan lebar kolom yang ditentukan,
            $hasilKolom1 = str_pad((isset($kolom1Array[$i]) ? $kolom1Array[$i] : ""), $lebar_kolom_1, " ");

            // Menggabungkan kolom tersebut menjadi 1 baris dan ditampung ke variabel hasil (ada 1 spasi disetiap kolom)
            $hasilBaris[] = $hasilKolom1;
        }

        // Hasil yang berupa array, disatukan kembali menjadi string dan tambahkan \n disetiap barisnya.
        return implode($hasilBaris) . "\n";
    }

    function buatBaris2Kolom($kolom1, $kolom2)
    {
        // Mengatur lebar setiap kolom (dalam satuan karakter)
        $lebar_kolom_1 = 23;
        $lebar_kolom_2 = 23;

        // Melakukan wordwrap(), jadi jika karakter teks melebihi lebar kolom, ditambahkan \n
        $kolom1 = wordwrap($kolom1, $lebar_kolom_1, "\n", true);
        $kolom2 = wordwrap($kolom2, $lebar_kolom_2, "\n", true);

        // Merubah hasil wordwrap menjadi array, kolom yang memiliki 2 index array berarti memiliki 2 baris (kena wordwrap)
        $kolom1Array = explode("\n", $kolom1);
        $kolom2Array = explode("\n", $kolom2);

        // Mengambil jumlah baris terbanyak dari kolom-kolom untuk dijadikan titik akhir perulangan
        $jmlBarisTerbanyak = max(count($kolom1Array), count($kolom2Array));

        // Mendeklarasikan variabel untuk menampung kolom yang sudah di edit
        $hasilBaris = array();

        // Melakukan perulangan setiap baris (yang dibentuk wordwrap), untuk menggabungkan setiap kolom menjadi 1 baris
        for ($i = 0; $i < $jmlBarisTerbanyak; $i++) {

            // memberikan spasi di setiap cell berdasarkan lebar kolom yang ditentukan,
            $hasilKolom1 = str_pad((isset($kolom1Array[$i]) ? $kolom1Array[$i] : ""), $lebar_kolom_1, " ");
            // memberikan rata kanan pada kolom 3 dan 4 karena akan kita gunakan untuk harga dan total harga
            $hasilKolom2 = str_pad((isset($kolom2Array[$i]) ? $kolom2Array[$i] : ""), $lebar_kolom_2, " ", STR_PAD_LEFT);

            // Menggabungkan kolom tersebut menjadi 1 baris dan ditampung ke variabel hasil (ada 1 spasi disetiap kolom)
            $hasilBaris[] = $hasilKolom1 . " " . $hasilKolom2;
        }

        // Hasil yang berupa array, disatukan kembali menjadi string dan tambahkan \n disetiap barisnya.
        return implode($hasilBaris) . "\n";
    }

    function buatBaris3Kolom($kolom1, $kolom2, $kolom3)
    {
        // Mengatur lebar setiap kolom (dalam satuan karakter)
        $lebar_kolom_1 = 4;
        $lebar_kolom_2 = 18;
        $lebar_kolom_3 = 24;

        // Melakukan wordwrap(), jadi jika karakter teks melebihi lebar kolom, ditambahkan \n
        $kolom1 = wordwrap($kolom1, $lebar_kolom_1, "\n", true);
        $kolom2 = wordwrap($kolom2, $lebar_kolom_2, "\n", true);
        $kolom3 = wordwrap($kolom3, $lebar_kolom_3, "\n", true);

        // Merubah hasil wordwrap menjadi array, kolom yang memiliki 2 index array berarti memiliki 2 baris (kena wordwrap)
        $kolom1Array = explode("\n", $kolom1);
        $kolom2Array = explode("\n", $kolom2);
        $kolom3Array = explode("\n", $kolom3);

        // Mengambil jumlah baris terbanyak dari kolom-kolom untuk dijadikan titik akhir perulangan
        $jmlBarisTerbanyak = max(count($kolom1Array), count($kolom2Array), count($kolom3Array));

        // Mendeklarasikan variabel untuk menampung kolom yang sudah di edit
        $hasilBaris = array();

        // Melakukan perulangan setiap baris (yang dibentuk wordwrap), untuk menggabungkan setiap kolom menjadi 1 baris
        for ($i = 0; $i < $jmlBarisTerbanyak; $i++) {

            // memberikan spasi di setiap cell berdasarkan lebar kolom yang ditentukan,
            $hasilKolom1 = str_pad((isset($kolom1Array[$i]) ? $kolom1Array[$i] : ""), $lebar_kolom_1, " ");
            // memberikan rata kanan pada kolom 3 dan 4 karena akan kita gunakan untuk harga dan total harga
            $hasilKolom2 = str_pad((isset($kolom2Array[$i]) ? $kolom2Array[$i] : ""), $lebar_kolom_2, " ", STR_PAD_LEFT);

            $hasilKolom3 = str_pad((isset($kolom3Array[$i]) ? $kolom3Array[$i] : ""), $lebar_kolom_3, " ", STR_PAD_LEFT);

            // Menggabungkan kolom tersebut menjadi 1 baris dan ditampung ke variabel hasil (ada 1 spasi disetiap kolom)
            $hasilBaris[] = $hasilKolom1 . " " . $hasilKolom2 . " " . $hasilKolom3;
        }

        // Hasil yang berupa array, disatukan kembali menjadi string dan tambahkan \n disetiap barisnya.
        return implode($hasilBaris) . "\n";
    }

    function buatBaris4Kolom($kolom1, $kolom2, $kolom3, $kolom4)
    {
        // Mengatur lebar setiap kolom (dalam satuan karakter)
        $lebar_kolom_1 = 4;
        $lebar_kolom_2 = 12;
        $lebar_kolom_3 = 4;
        $lebar_kolom_4 = 25;

        // Melakukan wordwrap(), jadi jika karakter teks melebihi lebar kolom, ditambahkan \n
        $kolom1 = wordwrap($kolom1, $lebar_kolom_1, "\n", true);
        $kolom2 = wordwrap($kolom2, $lebar_kolom_2, "\n", true);
        $kolom3 = wordwrap($kolom3, $lebar_kolom_3, "\n", true);
        $kolom4 = wordwrap($kolom4, $lebar_kolom_4, "\n", true);

        // Merubah hasil wordwrap menjadi array, kolom yang memiliki 2 index array berarti memiliki 2 baris (kena wordwrap)
        $kolom1Array = explode("\n", $kolom1);
        $kolom2Array = explode("\n", $kolom2);
        $kolom3Array = explode("\n", $kolom3);
        $kolom4Array = explode("\n", $kolom4);

        // Mengambil jumlah baris terbanyak dari kolom-kolom untuk dijadikan titik akhir perulangan
        $jmlBarisTerbanyak = max(count($kolom1Array), count($kolom2Array), count($kolom3Array), count($kolom4Array));

        // Mendeklarasikan variabel untuk menampung kolom yang sudah di edit
        $hasilBaris = array();

        // Melakukan perulangan setiap baris (yang dibentuk wordwrap), untuk menggabungkan setiap kolom menjadi 1 baris
        for ($i = 0; $i < $jmlBarisTerbanyak; $i++) {

            // memberikan spasi di setiap cell berdasarkan lebar kolom yang ditentukan,
            $hasilKolom1 = str_pad((isset($kolom1Array[$i]) ? $kolom1Array[$i] : ""), $lebar_kolom_1, " ");
            // memberikan rata kanan pada kolom 3 dan 4 karena akan kita gunakan untuk harga dan total harga
            $hasilKolom2 = str_pad((isset($kolom2Array[$i]) ? $kolom2Array[$i] : ""), $lebar_kolom_2, " ", STR_PAD_LEFT);

            $hasilKolom3 = str_pad((isset($kolom3Array[$i]) ? $kolom3Array[$i] : ""), $lebar_kolom_3, " ", STR_PAD_LEFT);

            $hasilKolom4 = str_pad((isset($kolom4Array[$i]) ? $kolom4Array[$i] : ""), $lebar_kolom_4, " ", STR_PAD_LEFT);

            // Menggabungkan kolom tersebut menjadi 1 baris dan ditampung ke variabel hasil (ada 1 spasi disetiap kolom)
            $hasilBaris[] = $hasilKolom1 . " " . $hasilKolom2 . " " . $hasilKolom3 . " " . $hasilKolom4;
        }

        // Hasil yang berupa array, disatukan kembali menjadi string dan tambahkan \n disetiap barisnya.
        return implode($hasilBaris) . "\n";
    }
}