<?php

namespace App\Controllers;

use App\Models\ModelPasien;

class Pasien extends BaseController
{
    protected $modelPasien;

    public function __construct()
    {
        // Cek apakah pengguna sudah login
        if (!session()->get('isLoggedIn')) {
            return redirect()->to('/login'); // Arahkan ke halaman login jika belum login
        }
        $this->modelPasien = new ModelPasien();
    }

    public function index()
    {
        $dataPasien = $this->modelPasien->getAllData();
        $dataBreadcumb = 'Pasien';



        $data = [
            'Breadcumb' => $dataBreadcumb,
            'pasien' => $dataPasien,
        ];

        return view('pasien/index', $data);
    }


    public function datatables()
    {
        $request = service('request');
        $model = new \App\Models\ModelPasien();

        $draw = $request->getPost('draw');
        $start = $request->getPost('start');
        $length = $request->getPost('length');
        $searchInput = $request->getPost('search');
        $search = isset($searchInput['value']) ? $searchInput['value'] : '';

        // ambil semua jika length = -1
        if ($length == -1) {
            $dataList = $model->getDatatables($search, null, null);
        } else {
            $dataList = $model->getDatatables($search, $length, $start);
        }

        $dataList = $model->getDatatables($search, $length, $start);
        $data = [];
        $no = $start + 1;

        foreach ($dataList as $row) {
            $data[] = [
                'no' => $no++,
                'no_rm' => $row->no_rm,
                'nik' => $row->nik,
                'no_bpjs' => $row->no_bpjs,
                'nama_pasien' => $row->nama_lengkap,
                'jenis_kelamin' => ($row->jenis_kelamin == 'L') ? 'Laki-laki' : 'Perempuan',
                'tanggal_lahir' => date('d-m-Y', strtotime($row->tanggal_lahir)),
                'alamat' => $row->alamat,
                'created_at' => date('d-m-Y H:i', strtotime($row->created_at)),
                'aksi' => '
                <button class="btn btn-warning btn-sm" onclick="updateData(' . $row->id_pasien . ')"><i data-feather=\'edit\'></i></button>
                <button class="btn btn-danger btn-sm" onclick="deleteData(' . $row->id_pasien . ')"><i data-feather=\'trash-2\'></i></button>
            '
            ];
        }

        return $this->response->setJSON([
            'draw' => intval($draw),
            'recordsTotal' => $model->countAllPasien(),
            'recordsFiltered' => $model->countFiltered($search),
            'data' => $data
        ]);
    }


    public function getData($id_pasien)
    {
        if ($this->request->isAJAX()) {

            $data = $this->modelPasien->find($id_pasien); // Ambil data berdasarkan ID

            if ($data) {
                echo json_encode($data); // Kirim data ke frontend
            } else {
                echo json_encode(null);
            }
        }
    }

    public function tambahData()
    {
        if ($this->request->isAJAX()) {

            // Ambil tanggal hari ini
            $tanggalHariIni = date('ymd'); // contoh: 250608

            // Cari jumlah pasien yang dibuat hari ini
            $today = date('Y-m-d');
            $countToday = $this->modelPasien
                ->where("DATE(created_at)", $today)
                ->countAllResults();

            // Buat nomor urut baru (ditambah 1)
            $urut = $countToday + 1;
            $urutFormatted = str_pad($urut, 4, '0', STR_PAD_LEFT); // jadi 0001, 0002, dst

            // Gabungkan jadi no_rm
            $no_rm = $tanggalHariIni . $urutFormatted;

            // Ambil data dari request POST
            $nik              = $this->request->getVar('nik');
            $no_bpjs           = $this->request->getVar('no_bpjs');
            $nama_lengkap           = $this->request->getVar('nama_lengkap');
            $tempat_lahir           = $this->request->getVar('tempat_lahir');
            $tanggallahir           = $this->request->getVar('tanggallahir');
            $jenis_kelamin           = $this->request->getVar('jenis_kelamin');
            $agama                  = $this->request->getVar('agama');
            $status_perkawinan           = $this->request->getVar('status_perkawinan');
            $pekerjaan           = $this->request->getVar('pekerjaan');
            $alamat            = $this->request->getVar('alamat');
            $provinsi            = $this->request->getVar('provinsi');
            $kab_kota            = $this->request->getVar('kab_kota');
            $no_hp                  = $this->request->getVar('no_hp');
            $email              = $this->request->getVar('email');

            // Validasi data (misalnya, pastikan semua field diisi)
            if (
                empty($nik)
            ) {
                $msg =  ['status' => 'error', 'message' => 'Field harus diisi semua'];
                echo json_encode($msg);
                return;
            }
            // Mendapatkan waktu sekarang untuk created_at dan updated_at
            $current_time = date('Y-m-d H:i:s');

            // Siapkan data untuk disimpan
            $data = [
                'no_rm'              => $no_rm,
                'nik'               => $nik,
                'no_bpjs'               => $no_bpjs,
                'nama_lengkap'               => $nama_lengkap,
                'tempat_lahir'               => $tempat_lahir,
                'tanggal_lahir'               => $tanggallahir,
                'jenis_kelamin'               => $jenis_kelamin,
                'agama'               => $agama,
                'status_perkawinan'               => $status_perkawinan,
                'pekerjaan'               => $pekerjaan,
                'alamat'            => $alamat,
                'provinsi'            => $provinsi,
                'kab_kota'            => $kab_kota,
                'no_hp'            => $no_hp,
                'email'            => $email,
                'created_at'     => $current_time,  // Menambahkan created_at
                'updated_at'     => $current_time   // Menambahkan updated_at
            ];

            // Memanggil method tambahData() dari model untuk insert data
            if ($this->modelPasien->tambahData($data)) {
                $msg = ['status' => 'success', 'message' => 'Data Pasien berhasil ditambahkan'];
                echo json_encode($msg);
            } else {
                $msg = ['status' => 'error', 'message' => 'Terjadi kesalahan saat menambahkan data'];
                echo json_encode($msg);
            }
        }
    }

    public function updateData()
    {
        if ($this->request->isAJAX()) {
            $id_pasien = $this->request->getVar('id_pasien');
            $nama_pasien              = $this->request->getVar('nama_pasien');
            $icdx           = $this->request->getVar('icdx');
            $jenis_kelamin           = $this->request->getVar('jenis_kelamin');
            $tanggallahir           = $this->request->getVar('tanggallahir');
            $alamat            = $this->request->getVar('alamat');

            // Mendapatkan waktu sekarang untuk created_at dan updated_at
            $current_time = date('Y-m-d H:i:s');

            // Validasi data (misalnya, pastikan semua field diisi)
            if (empty($nama_pasien)) {
                $msg = ['status' => 'error', 'message' => 'semua kolom harus diisi'];
                echo json_encode($msg);
                return;
            }


            $data = [
                'nama_pasien'              => $nama_pasien,
                'icdx'               => $icdx,
                'jenis_kelamin'               => $jenis_kelamin,
                'tanggallahir'               => $tanggallahir,
                'alamat'            => $alamat,
                'created_at'     => $current_time,  // Menambahkan created_at
                'updated_at'     => $current_time   // Menambahkan updated_at
            ];

            // Memanggil method updateData() dari model untuk insert data
            if ($this->modelPasien->updateData($id_pasien, $data)) {
                $msg = ['status' => 'success', 'message' => 'Data Pasien berhasil di update'];
            } else {
                $msg = ['status' => 'error', 'message' => 'Terjadi kesalahan saat menambahkan data'];
            }

            echo json_encode($msg);
        }
    }

    public function deleteData()
    {
        if ($this->request->isAJAX()) {
            // Ambil data dari request
            $id_pasien = $this->request->getVar('id_pasien');

            // Validasi apakah ID ada
            if (!$id_pasien) {
                return $this->response->setJSON([
                    'status' => 'error',
                    'message' => 'ID tidak ditemukan'

                ]);
            }



            // Cari data berdasarkan ID
            $pasienData = $this->modelPasien->find($id_pasien);
            if (!$pasienData) {
                return $this->response->setJSON([
                    'status' => 'error',
                    'message' => "Data pasien dengan ID $id_pasien tidak ditemukan"
                ]);
            }

            // Ambil nama untuk pesan sukses
            $nama = $pasienData['nama_pasien'] ?? 'Tidak Diketahui';

            // Proses penghapusan data
            if ($this->modelPasien->deleteData($id_pasien)) {
                return $this->response->setJSON([
                    'status' => 'success',
                    'message' => "Data pasien dengan Nama: $nama berhasil dihapus"
                ]);
            } else {
                return $this->response->setJSON([
                    'status' => 'error',
                    'message' => "Terjadi kesalahan saat menghapus data pasien"
                ]);
            }
        }

        // Jika bukan permintaan AJAX, tampilkan error
        return $this->response->setJSON([
            'status' => 'error',
            'message' => "Akses tidak valid"
        ]);
    }

    public function changeStatus()
    {
        $id_pasien = $this->request->getPost('id_pasien');
        $is_active = $this->request->getPost('is_active');



        if ($this->modelpasien->update($id_pasien, ['is_active' => $is_active])) {
            return $this->response->setJSON([
                'status' => 'success',
                'message' => 'Status pasien berhasil diubah.'
            ]);
        } else {
            return $this->response->setJSON([
                'status' => 'error',
                'message' => 'Gagal mengubah status pasien.'
            ]);
        }
    }

    public function importData()
    {
        $file = $this->request->getFile('fileImport');

        if ($file->isValid() && !$file->hasMoved()) {
            $ext = $file->getClientExtension();
            $validExtensions = ['xls', 'xlsx', 'csv'];

            if (in_array($ext, $validExtensions)) {
                $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader(ucfirst($ext));
                $spreadsheet = $reader->load($file->getTempName());

                // Ambil data dari sheet aktif dalam bentuk array
                $data = $spreadsheet->getActiveSheet()->toArray();

                // Model untuk tabel pasien
                $pasienModel = new Modelpasien();

                $rows = [];
                $duplicates = [];
                $errors = [];

                foreach ($data as $index => $row) {
                    if ($index === 0) continue; // Lewati header

                    $nama = trim($row[0]); // Kolom Nama pasien
                    $alamat = trim($row[1]);        // Kolom Alamat
                    $telepon = trim($row[2]);       // Kolom Telepon
                    $email = trim($row[3]);         // Kolom Email

                    // Validasi Nama pasien
                    if (empty($nama)) {
                        $errors[] = "Nama pasien kosong di baris $index.";
                        continue;
                    }

                    // Validasi Alamat
                    if (empty($alamat)) {
                        $errors[] = "Alamat kosong di baris $index.";
                        continue;
                    }

                    // Validasi Telepon (contoh: minimal 10 digit)
                    if (empty($telepon) || strlen($telepon) < 10) {
                        $errors[] = "Telepon tidak valid di baris $index.";
                        continue;
                    }

                    // Validasi Email (format email)
                    if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
                        $errors[] = "Email tidak valid di baris $index.";
                        continue;
                    }

                    // Cek duplikasi berdasarkan nama atau email
                    $existing = $pasienModel->where('email', $email)->orWhere('nama', $nama)->first();
                    if ($existing) {
                        $duplicates[] = $nama;
                        continue;
                    }

                    // Siapkan data untuk disimpan
                    $rows[] = [
                        'nama' => $nama,
                        'alamat' => $alamat,
                        'telepon' => $telepon,
                        'email' => $email,
                        // 'created_at' => date('Y-m-d H:i:s'),
                        // 'updated_at' => date('Y-m-d H:i:s'),
                    ];
                }

                $message = '';

                if (!empty($rows)) {
                    // Simpan data pasien
                    $pasienModel->insertBatch($rows);
                    $message = 'Data pasien berhasil diimport.';
                }

                // Tambahkan pesan jika ada duplikasi
                if (!empty($duplicates)) {
                    $message .= ' pasien berikut sudah ada: ' . implode(', ', $duplicates) . '. ';
                }

                // Tambahkan pesan jika ada kesalahan
                if (!empty($errors)) {
                    $message .= ' Kesalahan pada baris berikut: ' . implode(', ', $errors) . '.';
                }

                // Jika tidak ada data untuk diimport
                if (empty($rows) && empty($duplicates) && empty($errors)) {
                    $message = 'Tidak ada data pasien yang diimport.';
                }

                // Mengembalikan response
                if (!empty($errors) || !empty($duplicates)) {
                    return $this->response->setJSON(['status' => 'error', 'message' => $message]);
                }

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

            return $this->response->setJSON(['status' => 'error', 'message' => 'Format file tidak valid.']);
        }

        return $this->response->setJSON(['status' => 'error', 'message' => 'File tidak valid.']);
    }

    public function petapasien()
    {
        $datapasien = $this->Modelpasien->getAllData();
        $dataBreadcumb = 'Peta pasien';



        $data = [
            'Breadcumb' => $dataBreadcumb,
            'pasien' => $datapasien,
        ];

        return view('pasien/petapasien', $data);
    }

    public function getDataMappasien()
    {
        $pasien = $this->Modelpasien->getAllData();
        return $this->response->setJSON($pasien);
    }
}
