<?php

namespace App\Controllers;

/**
 * Port dari Manage.php (CI3) -- dashboard "Akun Saya" customer. Method
 * kirimsaldo() (transfer saldo antar-user) dan "Tarik Saldo" (penarikan ke
 * rekening bank) SENGAJA BELUM diport -- itu masuk fase pembayaran yang
 * ditunda sesuai rencana.
 *
 * Slice alamat, rekening bank, dan riwayat saldo + top-up Midtrans SUDAH
 * aktif lewat Assync::tambahAlamat()/getAlamat()/hapusAlamat(),
 * Assync::tambahRekening()/getRekening()/hapusRekening(), dan
 * Assync::topupSaldo()/batalTopup()/midtransTokenTopup()/midtransWebhook().
 *
 * Sistem status pesanan fisik/jasa lengkap (tab Belum Bayar/Dikemas/
 * Dikirim/Selesai/Batal/Pre Order di pesanan()) SUDAH aktif lewat
 * Assync::pesanan() dkk (lihat catatan slice 8 di Assync.php), termasuk
 * tombol "Beri Ulasan" di tab Selesai yang mengarah ke ulasan() di bawah.
 * konfirmasi() (upload bukti transfer manual) juga sudah aktif. Yang
 * BELUM: status pesanan utk PPOB (pesananppob() masih nunggu
 * Assync::pesananppob(), belum ada) & checkout/pelunasan Pre Order
 * (invoicepreorder/bayarpreorder, terpisah dari sekadar lihat status).
 */
class Manage extends BaseController
{
    private function cekLogin(): bool
    {
        return (bool) $this->func->cekLogin();
    }

    private function sudahVerif(): bool
    {
        return (int) session()->get('status') === 1;
    }

    private function render(string $view, array $extra = [], ?string $titel = null)
    {
        $data = array_merge(['func' => $this->func, 'db' => $this->db], $extra);
        if ($titel !== null) {
            $data['titel'] = $titel;
        }

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

    private function renderBelumVerif(string $titel = 'Akun Belum Terverifikasi')
    {
        return $this->render('main/sukses_verifikasi', ['belumverif' => true], $titel);
    }

    public function index()
    {
        if (! $this->cekLogin()) {
            return redirect()->to(site_url('home/signin'));
        }
        if (! $this->sudahVerif()) {
            return $this->renderBelumVerif();
        }

        $usrid          = session()->get('usrid');
        $daftarAlamat   = $this->db->table('alamat')->where('usrid', $usrid)->orderBy('status', 'DESC')->get()->getResult();
        $daftarRekening = $this->db->table('rekening')->where('usrid', $usrid)->get()->getResult();
        $saldoSaatIni   = (int) $this->func->getSaldo($usrid, 'saldo', 'usrid');
        $profilSaya     = $this->func->getProfil($usrid, 'semua', 'usrid');
        $userSaya       = $this->func->getUser($usrid, 'semua');

        return $this->render('admin/pengaturan', [
            'daftarAlamat'   => $daftarAlamat,
            'daftarRekening' => $daftarRekening,
            'saldoSaatIni'   => $saldoSaatIni,
            'profilSaya'     => $profilSaya,
            'userSaya'       => $userSaya,
        ], 'Akun Saya');
    }

    public function lacakpaket($orderid = null)
    {
        if ($orderid === null) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        $transaksi = $this->func->getTransaksi($orderid, 'semua', 'orderid');
        if ($transaksi === null) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        return $this->render('admin/lacakpaket', [
            'orderid'   => $orderid,
            'transaksi' => $transaksi,
        ], 'Lacak Paket');
    }

    public function produk()
    {
        if (! $this->cekLogin()) {
            return redirect()->to(site_url('home/signin'));
        }
        if (! $this->sudahVerif()) {
            return $this->renderBelumVerif();
        }

        return $this->render('admin/daftarproduk', [], 'Daftar Produk');
    }

    public function pesanan()
    {
        if (! $this->cekLogin()) {
            return redirect()->to(site_url('home/signin'));
        }
        if (! $this->sudahVerif()) {
            return $this->renderBelumVerif();
        }

        $konfirmasiId = $this->request->getGet('konfirmasi');
        if ($konfirmasiId !== null) {
            // Reset metode pembayaran lama supaya pelanggan bisa pilih ulang.
            // NB: notifikasi WA/email (notiftransfer() di CI3) BELUM diport --
            // butuh beberapa helper alamat/rekening tambahan, ditunda dulu.
            $this->db->table('pembayaran')->where('id', $konfirmasiId)->update([
                'ipaymu'          => '',
                'ipaymu_link'     => '',
                'ipaymu_trx'      => '',
                'ipaymu_tipe'     => '',
                'ipaymu_channel'  => '',
                'ipaymu_nama'     => '',
                'ipaymu_kode'     => '',
                'midtrans_id'     => '',
            ]);
        }

        return $this->render('admin/pesanan', ['konfirmasiId' => $konfirmasiId], 'Status Pesanan');
    }

    public function pesananppob()
    {
        if (! $this->cekLogin()) {
            return redirect()->to(site_url('home/signin'));
        }
        if (! $this->sudahVerif()) {
            return $this->renderBelumVerif();
        }

        $konfirmasiId = $this->request->getGet('konfirmasi');
        if ($konfirmasiId !== null) {
            // Lihat catatan notiftransfer() di pesanan() -- sama, belum diport.
            $this->db->table('pembayaran')->where('id', $konfirmasiId)->update([
                'ipaymu'          => '',
                'ipaymu_link'     => '',
                'ipaymu_trx'      => '',
                'ipaymu_tipe'     => '',
                'ipaymu_channel'  => '',
                'ipaymu_nama'     => '',
                'ipaymu_kode'     => '',
                'midtrans_id'     => '',
            ]);
        }

        return $this->render('admin/pesananppob', ['konfirmasiId' => $konfirmasiId], 'Status Pesanan Digital');
    }

    public function historidigital()
    {
        if (! $this->cekLogin()) {
            return redirect()->to(site_url('home/signin'));
        }

        $usrid  = session()->get('usrid');
        $cari   = trim((string) $this->request->getGet('cari'));
        $dari   = trim((string) $this->request->getGet('dari'));
        $sampai = trim((string) $this->request->getGet('sampai'));
        $page   = max(1, (int) $this->request->getGet('page'));
        $perpage = 15;

        // Tanpa filter tanggal dari user, tampilkan SEMUA histori (bukan
        // cuma hari ini) -- default lama bikin halaman tampak kosong kalau
        // user tidak ada transaksi hari itu.
        $tanggalDefault = ($dari === '' && $sampai === '');

        $buildQuery = function () use ($usrid, $cari, $dari, $sampai) {
            $builder = $this->db->table('transaksiprodukdigital')
                ->join('transaksidigital', 'transaksidigital.id = transaksiprodukdigital.idtransaksi')
                ->join('produkdigital', 'produkdigital.id = transaksiprodukdigital.idproduk', 'left')
                ->where('transaksidigital.usrid', $usrid);

            if ($cari !== '') {
                $builder->groupStart()
                    ->like('produkdigital.nama', $cari)
                    ->orLike('transaksiprodukdigital.variasi', $cari)
                    ->orLike('transaksidigital.orderid', $cari)
                    ->orLike('transaksiprodukdigital.keterangan', $cari)
                    ->orLike('transaksiprodukdigital.idpo', $cari)
                    ->groupEnd();
            }
            if ($dari !== '') {
                $builder->where('transaksidigital.tgl >=', $dari . ' 00:00:00');
            }
            if ($sampai !== '') {
                $builder->where('transaksidigital.tgl <=', $sampai . ' 23:59:59');
            }

            return $builder;
        };

        $totalRows = $buildQuery()->countAllResults();

        $rows = $buildQuery()
            ->select('transaksiprodukdigital.*, transaksidigital.orderid, transaksidigital.tgl as tgl_transaksi, transaksidigital.status as status_transaksi, produkdigital.nama as nama_kategori, produkdigital.idcat as idcat_kategori')
            ->orderBy('transaksidigital.tgl', 'DESC')
            ->limit($perpage, ($page - 1) * $perpage)
            ->get()
            ->getResult();

        return $this->render('admin/historidigital', [
            'cari'           => $cari,
            'dari'           => $dari,
            'sampai'         => $sampai,
            'tanggalDefault' => $tanggalDefault,
            'page'           => $page,
            'perpage'        => $perpage,
            'totalRows'      => $totalRows,
            'rows'           => $rows,
        ], 'Histori Transaksi Digital');
    }

    public function strukdigital($id = 0)
    {
        if (! $this->cekLogin()) {
            return redirect()->to(site_url('home/signin'));
        }

        $row = $this->db->table('transaksiprodukdigital')
            ->select('transaksiprodukdigital.*, transaksidigital.orderid, transaksidigital.tgl as tgl_transaksi, transaksidigital.status as status_transaksi, transaksidigital.selesai, produkdigital.nama as nama_kategori, produkdigital.idcat as idcat_kategori')
            ->join('transaksidigital', 'transaksidigital.id = transaksiprodukdigital.idtransaksi')
            ->join('produkdigital', 'produkdigital.id = transaksiprodukdigital.idproduk', 'left')
            ->where('transaksiprodukdigital.id', (int) $id)
            ->where('transaksidigital.usrid', session()->get('usrid'))
            ->get()
            ->getRow();

        if ($row === null) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        return $this->render('admin/strukdigital', ['r' => $row], 'Struk Transaksi');
    }

    /** Port dari Manage::ulasan() (CI3) -- lihat/kirim ulasan produk per pesanan. */
    public function ulasan($orderid = 0)
    {
        if (! $this->cekLogin()) {
            return redirect()->to(site_url('home/signin'));
        }
        if (! $this->sudahVerif()) {
            return $this->renderBelumVerif();
        }

        $order = $this->db->table('transaksi')->where('orderid', $orderid)->get()->getRow();
        if ($order === null) {
            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
        }

        $sudahUlasan = $this->db->table('review')->where('idtransaksi', $order->id)->get()->getResult();
        $produkPesanan = $this->db->table('transaksiproduk')->where('idtransaksi', $order->id)->get()->getResult();

        return $this->render('admin/review', [
            'order'         => $order,
            'sudahUlasan'   => $sudahUlasan,
            'produkPesanan' => $produkPesanan,
            'usrid'         => $this->func->cekLogin(),
        ], 'Ulasan Produk');
    }

    /**
     * Chat ke admin -- fitur BARU di web (CI3 web tidak pernah punya UI ini,
     * cuma ada di API mobile Apih2h::chat()/kirimpesan()/chatnotif()). Tabel
     * `pesan` yang dipakai SAMA dgn histori mobile existing, jadi thread di
     * web ini menyatu dengan histori chat dari aplikasi mobile.
     */
    /**
     * Port dari Manage::konfirmasi() (CI3) -- upload bukti transfer manual.
     * Disimpan ke folder fisik yang SAMA dgn CI3 (`admin/konfirmasi/`,
     * bukan folder baru di customer-v4) krn sisi admin (masih CI3, aktif)
     * yang menampilkan bukti ini ke penjual/admin membaca dari path itu.
     */
    public function konfirmasi()
    {
        $usrid   = $this->func->cekLogin();
        $idbayar = $this->request->getPost('idbayar');
        if ($usrid === 0 || $idbayar === null) {
            return redirect()->to(site_url('manage/pesanan'));
        }

        $bayar = $this->func->getBayar($idbayar, 'semua');
        if ($bayar === null || (int) $bayar->usrid !== $usrid) {
            return redirect()->to(site_url('manage/pesanan'));
        }

        $file = $this->request->getFile('bukti');
        if ($file === null || ! $file->isValid() || ! in_array($file->getExtension(), ['jpg', 'jpeg', 'png', 'gif'], true)) {
            return redirect()->to(site_url('manage/pesanan'))->with('error', 'Gagal mengunggah bukti transfer.');
        }

        $uploadPath = realpath(ROOTPATH . '../admin/konfirmasi') ?: ROOTPATH . '../admin/konfirmasi';
        $filename   = $usrid . $idbayar . date('YmdHis') . '.' . $file->getExtension();
        $file->move($uploadPath, $filename);

        \Config\Services::image()
            ->withFile($uploadPath . DIRECTORY_SEPARATOR . $filename)
            ->fit(1024, 720, 'top')
            ->save($uploadPath . DIRECTORY_SEPARATOR . $filename);

        $this->db->table('konfirmasi')->insert(['tgl' => date('Y-m-d H:i:s'), 'idbayar' => $idbayar, 'bukti' => $filename]);

        return redirect()->to(site_url('manage/pesanan'));
    }

    public function pesan()
    {
        $usrid = $this->func->cekLogin();
        if ($usrid === 0) {
            return redirect()->to(site_url('home/signin'));
        }
        if (! $this->sudahVerif()) {
            return $this->renderBelumVerif();
        }

        $this->db->table('pesan')->where('tujuan', $usrid)->where('baca', 0)->update(['baca' => 1]);

        $pesan = $this->db->table('pesan')
            ->groupStart()->where('tujuan', $usrid)->orWhere('dari', $usrid)->groupEnd()
            ->orderBy('tgl', 'ASC')
            ->get()
            ->getResult();

        return $this->render('admin/pesan', ['pesan' => $pesan], 'Pesan');
    }
}
