<?php
defined('BASEPATH') or exit('No direct script access allowed');

class Kasir extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->library('session');
        $this->load->helper(['url', 'general_helper']);

        if (!$this->session->userdata('logged_in')) {
            redirect('welcome');
        }
    }

    public function index()
    {
        $filters = [
            'status' => $this->input->get('status') ?: 'all',
            'keyword' => trim((string) $this->input->get('keyword')),
            'tanggal' => $this->input->get('tanggal') ?: date('Y-m-d'),
        ];

        $tagihan = array_map(function ($row) {
            $row = $this->hydrate_tagihan($row);
            $payment = $this->get_payment_state($row['tagihan_id']);
            if ($payment) {
                $row['status_tagihan'] = 'LUNAS';
                $row['jumlah_bayar'] = $payment['jumlah_bayar'];
                $row['metode_bayar'] = $payment['metode_bayar'];
                $row['waktu_bayar'] = $payment['waktu_bayar'];
            }
            return $row;
        }, $this->dummy_tagihan());

        $tagihan = array_values(array_filter($tagihan, function ($row) use ($filters) {
            if ($filters['status'] !== 'all' && $row['status_tagihan'] !== $filters['status']) {
                return false;
            }
            if ($filters['tanggal'] !== '' && $row['tanggal_tagihan'] !== $filters['tanggal']) {
                return false;
            }
            if ($filters['keyword'] !== '') {
                $needle = mb_strtolower($filters['keyword']);
                $haystack = mb_strtolower($row['no_tagihan'] . ' ' . $row['rme_no'] . ' ' . $row['nama_pasien'] . ' ' . $row['nama_poli']);
                if (strpos($haystack, $needle) === false) {
                    return false;
                }
            }
            return true;
        }));

        $data = [
            'title' => 'Kasir',
            'filters' => $filters,
            'tagihan' => $tagihan,
            'summary' => $this->build_summary($tagihan),
        ];

        $this->render('kasir/index', $data);
    }

    public function detail($tagihan_id)
    {
        $tagihan = $this->find_tagihan($tagihan_id);
        if (!$tagihan) {
            show_404();
        }

        $payment = $this->get_payment_state($tagihan_id);
        if ($payment) {
            $tagihan['status_tagihan'] = 'LUNAS';
            $tagihan['jumlah_bayar'] = $payment['jumlah_bayar'];
            $tagihan['metode_bayar'] = $payment['metode_bayar'];
            $tagihan['waktu_bayar'] = $payment['waktu_bayar'];
            $tagihan['kasir_nama'] = $payment['kasir_nama'];
            $tagihan['nomor_referensi'] = $payment['nomor_referensi'];
            $tagihan['kembalian'] = $payment['kembalian'];
        }

        $data = [
            'title' => 'Detail Tagihan Kasir',
            'tagihan' => $tagihan,
            'metode_bayar' => [
                'TUNAI' => 'Tunai',
                'QRIS' => 'QRIS',
                'DEBIT' => 'Kartu Debit',
                'TRANSFER' => 'Transfer',
            ],
        ];

        $this->render('kasir/detail', $data);
    }

    public function bayar($tagihan_id)
    {
        $tagihan = $this->find_tagihan($tagihan_id);
        if (!$tagihan) {
            show_404();
        }

        $jumlahBayar = (float) ($this->input->post('jumlah_bayar') ?: 0);
        $metodeBayar = trim((string) $this->input->post('metode_bayar', true));
        $nomorReferensi = trim((string) $this->input->post('nomor_referensi', true));
        $kasirNama = $this->session->userdata('nama_lengkap') ?: 'Petugas Kasir';

        if ($jumlahBayar < (float) $tagihan['grand_total']) {
            $this->session->set_flashdata('error', 'Jumlah bayar masih kurang dari total tagihan.');
            redirect('kasir/detail/' . $tagihan_id);
        }

        $state = $this->session->userdata('kasir_dummy_payment') ?: [];
        $state[$tagihan_id] = [
            'jumlah_bayar' => $jumlahBayar,
            'metode_bayar' => $metodeBayar ?: 'TUNAI',
            'nomor_referensi' => $nomorReferensi,
            'waktu_bayar' => date('Y-m-d H:i:s'),
            'kasir_nama' => $kasirNama,
            'kembalian' => $jumlahBayar - (float) $tagihan['grand_total'],
        ];
        $this->session->set_userdata('kasir_dummy_payment', $state);

        redirect('kasir/selesai/' . $tagihan_id);
    }

    public function selesai($tagihan_id)
    {
        $tagihan = $this->find_tagihan($tagihan_id);
        $payment = $this->get_payment_state($tagihan_id);

        if (!$tagihan || !$payment) {
            redirect('kasir/detail/' . $tagihan_id);
        }

        $tagihan['status_tagihan'] = 'LUNAS';
        $tagihan['jumlah_bayar'] = $payment['jumlah_bayar'];
        $tagihan['metode_bayar'] = $payment['metode_bayar'];
        $tagihan['waktu_bayar'] = $payment['waktu_bayar'];
        $tagihan['kasir_nama'] = $payment['kasir_nama'];
        $tagihan['nomor_referensi'] = $payment['nomor_referensi'];
        $tagihan['kembalian'] = $payment['kembalian'];

        $data = [
            'title' => 'Pembayaran Selesai',
            'tagihan' => $tagihan,
        ];

        $this->render('kasir/selesai', $data);
    }

    private function get_payment_state($tagihan_id)
    {
        $state = $this->session->userdata('kasir_dummy_payment') ?: [];
        return $state[$tagihan_id] ?? null;
    }

    private function build_summary(array $tagihan)
    {
        $summary = [
            'total_tagihan' => count($tagihan),
            'menunggu' => 0,
            'lunas' => 0,
            'nilai_tagihan' => 0,
            'nilai_lunas' => 0,
        ];

        foreach ($tagihan as $row) {
            $summary['nilai_tagihan'] += (float) $row['grand_total'];
            if ($row['status_tagihan'] === 'LUNAS') {
                $summary['lunas']++;
                $summary['nilai_lunas'] += (float) $row['grand_total'];
            } else {
                $summary['menunggu']++;
            }
        }

        return $summary;
    }

    private function find_tagihan($tagihan_id)
    {
        foreach ($this->dummy_tagihan() as $row) {
            if ($row['tagihan_id'] === $tagihan_id) {
                return $this->hydrate_tagihan($row);
            }
        }

        return null;
    }

    private function dummy_tagihan()
    {
        return [
            [
                'tagihan_id' => 'TAGIHAN-001',
                'no_tagihan' => 'INV-KSR-20260623-001',
                'registrasi_id' => 'REG-001',
                'rme_no' => 'RME-2026-0001',
                'nama_pasien' => 'Siti Aisyah',
                'nama_poli' => 'Poli Umum',
                'dokter' => 'dr. Nanda Putra',
                'tanggal_tagihan' => date('Y-m-d'),
                'status_tagihan' => 'MENUNGGU',
                'tipe_pembayaran' => 'UMUM',
                'items' => [
                    ['kategori' => 'Administrasi', 'deskripsi' => 'Biaya administrasi pendaftaran', 'qty' => 1, 'harga' => 15000],
                    ['kategori' => 'Konsultasi', 'deskripsi' => 'Konsultasi dokter umum', 'qty' => 1, 'harga' => 75000],
                    ['kategori' => 'Farmasi', 'deskripsi' => 'Amoxicillin 500 mg', 'qty' => 10, 'harga' => 2500],
                    ['kategori' => 'Farmasi', 'deskripsi' => 'Paracetamol 500 mg', 'qty' => 10, 'harga' => 1200],
                ],
            ],
            [
                'tagihan_id' => 'TAGIHAN-002',
                'no_tagihan' => 'INV-KSR-20260623-002',
                'registrasi_id' => 'REG-002',
                'rme_no' => 'RME-2026-0042',
                'nama_pasien' => 'Budi Santoso',
                'nama_poli' => 'Poli Gigi',
                'dokter' => 'drg. Ayu Lestari',
                'tanggal_tagihan' => date('Y-m-d'),
                'status_tagihan' => 'MENUNGGU',
                'tipe_pembayaran' => 'UMUM',
                'items' => [
                    ['kategori' => 'Administrasi', 'deskripsi' => 'Biaya administrasi pendaftaran', 'qty' => 1, 'harga' => 15000],
                    ['kategori' => 'Tindakan', 'deskripsi' => 'Tambal gigi komposit', 'qty' => 1, 'harga' => 180000],
                    ['kategori' => 'Farmasi', 'deskripsi' => 'Asam mefenamat 500 mg', 'qty' => 10, 'harga' => 1800],
                ],
            ],
            [
                'tagihan_id' => 'TAGIHAN-003',
                'no_tagihan' => 'INV-KSR-20260623-003',
                'registrasi_id' => 'REG-003',
                'rme_no' => 'RME-2026-0108',
                'nama_pasien' => 'Rahmawati',
                'nama_poli' => 'Poli Anak',
                'dokter' => 'dr. Fajar Hidayat',
                'tanggal_tagihan' => date('Y-m-d'),
                'status_tagihan' => 'MENUNGGU',
                'tipe_pembayaran' => 'BPJS',
                'items' => [
                    ['kategori' => 'Administrasi', 'deskripsi' => 'Biaya administrasi pendaftaran', 'qty' => 1, 'harga' => 0],
                    ['kategori' => 'Konsultasi', 'deskripsi' => 'Konsultasi dokter anak', 'qty' => 1, 'harga' => 0],
                    ['kategori' => 'Farmasi', 'deskripsi' => 'Vitamin anak sirup', 'qty' => 1, 'harga' => 35000],
                ],
            ],
        ];
    }

    private function hydrate_tagihan(array $tagihan)
    {
        $subtotal = 0;
        foreach ($tagihan['items'] as $index => $item) {
            $lineTotal = (float) $item['qty'] * (float) $item['harga'];
            $tagihan['items'][$index]['total'] = $lineTotal;
            $subtotal += $lineTotal;
        }

        $diskon = (float) ($tagihan['tipe_pembayaran'] === 'BPJS' ? 0 : 0);
        $tagihan['subtotal'] = $subtotal;
        $tagihan['diskon'] = $diskon;
        $tagihan['grand_total'] = $subtotal - $diskon;

        return $tagihan;
    }
}
