<?php

namespace App\Controllers;


use App\Models\ModelKunjungan;
use App\Models\ModelPasien;
use App\Models\ModelDokter;

class Kunjungan extends BaseController
{
    protected $modelKunjungan;
    protected $modelPasien;
    protected $modelDokter;

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

    public function index()
    {
        $dataKunjungan = $this->modelKunjungan->getAllData();
        $dataPasien = $this->modelPasien->getAllData();
        $dataDokter = $this->modelDokter->getAllData();
        $dataBreadcumb = 'Kunjungan';

        $data = [
            'Breadcumb' => $dataBreadcumb,
            'kunjungan' => $dataKunjungan,
            'pasien' => $dataPasien,
            'dokter' => $dataDokter,
        ];

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

    public function getData($id_kunjungan)
    {
        if ($this->request->isAJAX()) {
            $data = $this->modelKunjungan->find($id_kunjungan); // 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 data dari form
            $id_pasien  = $this->request->getVar('id_pasien');
            $id_dokter  = $this->request->getVar('id_dokter');
            $keluhan    = $this->request->getVar('keluhan');
            $diagnosa   = $this->request->getVar('diagnosa');

            // Validasi data
            $errors = [];

            if (empty($id_pasien)) $errors[] = 'Pasien';
            if (empty($id_dokter)) $errors[] = 'Dokter';
            if (empty($keluhan))   $errors[] = 'Keluhan';
            if (empty($diagnosa))  $errors[] = 'Diagnosa';


            if (!empty($errors)) {
                return $this->response->setJSON([
                    'status' => 'error',
                    'message' => 'Field berikut harus diisi: ' . implode(', ', $errors)
                ]);
            }

            // Siapkan data
            $data = [
                'id_pasien'         => $id_pasien,
                'id_dokter'         => $id_dokter,
                'keluhan'           => $keluhan,
                'diagnosa'          => $diagnosa,
                'tanggal_kunjungan' => date('Y-m-d H:i:s') // bisa juga dikosongkan, karena sudah default CURRENT_TIMESTAMP
            ];

            if ($this->modelKunjungan->tambahData($data)) {
                return $this->response->setJSON([
                    'status' => 'success',
                    'message' => 'Data Kunjungan berhasil ditambahkan'
                ]);
            } else {
                return $this->response->setJSON([
                    'status' => 'error',
                    'message' => 'Gagal menyimpan data ke database'
                ]);
            }
        }
    }

    public function updateData()
    {
        if ($this->request->isAJAX()) {
            $id_kunjungan = $this->request->getVar('id_kunjungan');
            $id_pasien    = $this->request->getVar('id_pasien');
            $id_dokter    = $this->request->getVar('id_dokter');
            $keluhan      = $this->request->getVar('keluhan');
            $diagnosa     = $this->request->getVar('diagnosa');

            // Validasi data (cek field kosong)
            $errors = [];

            if (empty($id_pasien))  $errors[] = 'Pasien';
            if (empty($id_dokter))  $errors[] = 'Dokter';
            if (empty($keluhan))    $errors[] = 'Keluhan';
            if (empty($diagnosa))   $errors[] = 'Diagnosa';

            if (!empty($errors)) {
                $msg = [
                    'status' => 'error',
                    'message' => 'Field berikut harus diisi: ' . implode(', ', $errors)
                ];
                echo json_encode($msg);
                return;
            }

            // Siapkan data untuk update
            $data = [
                'id_pasien' => $id_pasien,
                'id_dokter' => $id_dokter,
                'keluhan'   => $keluhan,
                'diagnosa'  => $diagnosa
            ];

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

            echo json_encode($msg);
        }
    }

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

            // Validasi apakah ID ada
            if (!$id_kunjungan) {
                return $this->response->setJSON(['status' => 'error', 'message' => 'ID Kunjungan tidak ditemukan dalam permintaan']);
            }

            // Cari data berdasarkan ID
            // Ambil data kunjungan lengkap (join ke pasien dan dokter)
            $dataKunjungan = $this->modelKunjungan
                ->select('kunjungan.*, pasien.nama_lengkap AS nama_pasien, dokter.nama_dokter')
                ->join('pasien', 'pasien.id_pasien = kunjungan.id_pasien')
                ->join('dokter', 'dokter.id_dokter = kunjungan.id_dokter')
                ->where('id_kunjungan', $id_kunjungan)
                ->first();
            if (!$dataKunjungan) {
                return $this->response->setJSON([
                    'status' => 'error',
                    'message' => "Data kunjungan dengan ID $id_kunjungan tidak ditemukan"
                ]);
            }

            // Ambil nama pasien dan dokter
            $namaPasien = $dataKunjungan['nama_pasien'] ?? 'Pasien Tidak Diketahui';
            $namaDokter = $dataKunjungan['nama_dokter'] ?? 'Dokter Tidak Diketahui';


            // Proses penghapusan data
            if ($this->modelKunjungan->delete($id_kunjungan)) {
                return $this->response->setJSON([
                    'status' => 'success',
                    'message' => "Data Kunjungan \"$namaPasien\" dengan dokter \"$namaDokter\" berhasil dihapus"
                ]);
            } else {
                return $this->response->setJSON([
                    'status' => 'error',
                    'message' => "Terjadi kesalahan saat menghapus data Kunjungan"
                ]);
            }
        }

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

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


        if ($this->modelKunjungan->update($id_Kunjungan, ['is_active' => $is_active])) {
            return $this->response->setJSON([
                'status' => 'success',
                'message' => 'Status Kunjungan berhasil diubah.'
            ]);
        } else {
            return $this->response->setJSON([
                'success' => false,
                'message' => 'Gagal mengubah status Produk.'
            ]);
        }
    }

    public function getKunjunganBySiswa($id_siswa)
    {
        $Kunjungan = $this->modelKunjungan
            ->where('id_siswa', $id_siswa)
            ->where('is_active', 1)
            ->first();

        if ($Kunjungan) {
            echo json_encode($Kunjungan);
        } else {
            echo json_encode(null);
        }
    }

    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());
                $data = $spreadsheet->getActiveSheet()->toArray();

                // Validasi dan simpan data
                $KunjunganModel = new ModelKunjungan();
                $rows = [];
                $duplicates = [];
                $errors = [];

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

                    // Pengecekan duplikasi berdasarkan NIK
                    $existing = $KunjunganModel->where('nik', $row[1])->first();
                    if ($existing) {
                        $duplicates[] = $row[1]; // Simpan NIK yang duplikat
                        continue; // Skip data ini
                    }

                    $rows[] = [
                        'nama' => $row[0],
                        'nik' => $row[1],
                        'tanggal_lahir' => $row[2],
                        'jenis_kelamin' => $row[3],
                        'alamat' => $row[4],
                        'nama_ibu' => $row[5],
                        'nama_ayah' => $row[6],
                        'status_imunisasi' => $row[7],
                        'berat_badan' => $row[8],
                        'tinggi_badan' => $row[9],
                    ];
                }

                if (!empty($rows)) {
                    $KunjunganModel->insertBatch($rows);
                    $message = 'Data berhasil diimport.';
                }

                // Jika ada duplikasi, tambahkan pesan
                if (!empty($duplicates)) {
                    $message = 'Data dengan NIK berikut sudah ada: ' . implode(', ', $duplicates) . '. ';
                }

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

                // Mengembalikan response
                if ($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.']);
    }
}
