<?php

namespace App\Controllers;

/**
 * Port dari Ppob.php (CI3) -- HANYA halaman tampilan kategori (supaya
 * setiap ikon kategori di beranda punya halaman saat diklik). Method
 * transaksi/AJAX-harga-live (datalistajax, tambahkeranjangppob,
 * bayarpesananppob, TokenPln, TopupPraMobilpulsa, dkk) BELUM diport --
 * itu masuk fase pembayaran/PPOB live yang ditunda sesuai rencana.
 */
class Ppob extends BaseController
{
    private function render(string $view, array $extra = [])
    {
        $data = array_merge(['func' => $this->func, 'db' => $this->db], $extra);

        return view('customer/head', $data) . view('customer/' . $view, $data) . view('customer/foot', $data);
    }

    public function index()
    {
        return $this->render('paketdata');
    }

    public function kategori()
    {
        return $this->render('kategorilayanan');
    }

    public function data()
    {
        return $this->render('paketdata');
    }

    public function paketvoucher()
    {
        return $this->render('voucheraktivasi');
    }

    public function masaaktif()
    {
        return $this->render('masaaktif');
    }

    public function pulsa()
    {
        return $this->render('pulsa');
    }

    public function token()
    {
        return $this->render('tokenpln');
    }

    public function emoney()
    {
        return $this->render('emoney');
    }

    public function games()
    {
        return $this->render('games');
    }

    public function voucher()
    {
        return $this->render('voucher');
    }

    public function tvprabayar()
    {
        return $this->render('tv');
    }

    public function paketsms()
    {
        return $this->render('paketsms');
    }

    public function pascabayar(string $brand)
    {
        $set  = $this->func->getSetting('semua');
        $data = ((int) ($set->jalur_digiflazz ?? 0) === 1) ? $this->func->HargaPascabayar() : null;

        return $this->render('ppob-pasca', ['jenispasca' => $brand, 'data' => $data]);
    }

    /**
     * Tidak ada method aslinya di CI3 (ikon "Transfer Bank" di beranda
     * sebenarnya 404 di sistem lama juga) -- halaman penjelasan singkat
     * ditambahkan supaya ikonnya tidak 404, pemilihan bank sungguhan
     * tetap di alur checkout/top up saldo (belum diport).
     */
    public function transferbank()
    {
        return $this->render('transferbank');
    }

    /**
     * AJAX nominal list (dipanggil dari pulsa.php/paketdata.php saat nomor
     * HP diketik). Lihat catatan lengkap di
     * GlobalDataModel::getNominalPrabayar() kenapa sumber harganya dari
     * tabel `margin`, bukan panggil API Digiflazz langsung di sini.
     */
    public function datalistajax(int $produk, string $brand)
    {
        $grup = $this->func->getNominalPrabayar($produk, $brand);

        return view('customer/ppobdataajax', ['func' => $this->func, 'db' => $this->db, 'grup' => $grup]);
    }

    /**
     * Halaman nominal untuk provider E-Money/Games/Voucher/TV
     * Prabayar/Paket SMS (link dari logo provider di emoney.php dkk).
     * Sumber harga sama seperti datalistajax() -- lihat catatan di
     * GlobalDataModel::getNominalPrabayar().
     */
    public function prabayar(int $produk, string $brand)
    {
        $brand = str_replace('%20', ' ', $brand);
        $grup  = $this->func->getNominalPrabayar($produk, $brand);

        return $this->render('ppob-pra', ['grup' => $grup]);
    }

    /**
     * Cek nomor pelanggan PLN (token & tagihan) -- submit dari form di
     * tokenpln.php. Lihat catatan di GlobalDataModel::inquiryPln().
     */
    public function tokenpln()
    {
        $nopelanggan = (string) $this->request->getPost('nopelanggan');
        if ($nopelanggan === '') {
            return redirect()->to(site_url('ppob/token'));
        }

        $data       = $this->func->inquiryPln($nopelanggan);
        $errorPesan = null;

        if ($data === null) {
            $errorPesan = 'Tidak dapat menghubungi server cek PLN, silahkan coba lagi beberapa saat lagi.';
        } elseif (empty($data->data->name ?? null) && ! empty($data->data->message ?? null)) {
            // rc/status error dari Digiflazz (mis. IP belum di-whitelist, format
            // nomor salah, dll) -- BUKAN berarti nomor pelanggan tidak terdaftar,
            // jadi pesan aslinya ditampilkan supaya tidak menyesatkan.
            $errorPesan = $data->data->message;
        }

        $grup = (! empty($data->data->name ?? null))
            ? $this->func->getNominalPrabayar(3, 'PLN')
            : [];

        return $this->render('ppob-tokenpln', ['data' => $data, 'grup' => $grup, 'errorPesan' => $errorPesan]);
    }

    /**
     * Tambah 1 item PPOB ke keranjang -- port dari
     * Ppob::tambahkeranjangppob() (CI3). Murni menyimpan baris "pending"
     * (idtransaksi=0) di transaksiprodukdigital, TIDAK memotong saldo/
     * memanggil payment gateway (itu di Cekout::bayarpesananppob(),
     * sengaja belum diport -- fase pembayaran).
     */
    public function tambahkeranjangppob()
    {
        $usrid = session()->get('usrid');
        if ($usrid === null) {
            return redirect()->to(site_url('home/signin'));
        }

        $this->db->table('transaksiprodukdigital')
            ->where('idtransaksi', 0)
            ->where('usrid', $usrid)
            ->delete();

        $idproduk      = (int) $this->request->getPost('idproduk');
        $buyerSkuCode  = (string) $this->request->getPost('idpo');
        $h2h           = (int) $this->request->getPost('h2h');
        $hargabeliPost = (float) $this->request->getPost('hargabeli');
        $hargadataPost = (float) ($this->request->getPost('hargadata') ?? $this->request->getPost('hargabeli'));

        if ($idproduk === 25) {
            $hargabeli = $hargabeliPost;
            $hargajual = $hargadataPost !== 0.0 ? $hargadataPost : $hargabeliPost;
        } else {
            $hargajual = $this->func->hargaJualSku($buyerSkuCode, $h2h);
            if ($hargajual === null || (int) round($hargajual) !== (int) round($hargadataPost)) {
                $this->db->table('userdata')->where('id', $usrid)->update(['fcmtoken' => '', 'status' => 2]);

                return redirect()->to(site_url('ppob'))->with('error', 'Harga sudah berubah, silahkan pilih ulang.');
            }
            $hargabeli = $hargabeliPost;
        }

        $this->db->table('transaksiprodukdigital')->insert([
            'usrid'         => $usrid,
            'idproduk'      => $idproduk,
            'tgl'           => date('Y-m-d H:i:s'),
            'jumlah'        => 1,
            'hargabeli'     => $hargabeli,
            'harga'         => $hargajual,
            'pasca_code'    => (string) $this->request->getPost('pasca_code'),
            'keterangan'    => (string) $this->request->getPost('keterangan'),
            'variasi'       => (string) $this->request->getPost('nohp'),
            'idpo'          => $buyerSkuCode,
            'h2h'           => $h2h,
            'komisi_upline' => (string) $this->request->getPost('komisi_upline'),
            'idtransaksi'   => 0,
        ]);

        return redirect()->to(site_url('home/keranjangppob'));
    }

    /**
     * Hapus 1 item dari keranjang PPOB -- versi ringan dari
     * Assync::hapuskeranjangppob() (controller itu di luar cakupan fase
     * ini), dibuat agar tombol "Hapus" di halaman keranjang berfungsi.
     */
    public function hapuskeranjangppob()
    {
        $usrid = session()->get('usrid');
        if ($usrid === null) {
            return $this->response->setJSON(['success' => false]);
        }

        $id = (int) $this->request->getPost('id');
        $this->db->table('transaksiprodukdigital')
            ->where('id', $id)
            ->where('usrid', $usrid)
            ->delete();

        return $this->response->setJSON(['success' => true]);
    }
}
