<?php
// ═══════════════════════════════════════════════════════════════════════
// TAMBAHKAN METHOD BERIKUT KE CONTROLLER: Kartu_keluarga.php
// ═══════════════════════════════════════════════════════════════════════

// ── Download Template Excel ──────────────────────────────────────────
public function download_template()
{
    $file = FCPATH . 'assets/template/template_import_warga.xlsx';

    if (!file_exists($file)) {
        $this->session->set_flashdata('error', 'File template tidak ditemukan. Hubungi administrator.');
        redirect('kartu-keluarga');
        return;
    }

    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment; filename="template_import_warga.xlsx"');
    header('Content-Length: ' . filesize($file));
    header('Cache-Control: max-age=0');
    readfile($file);
    exit;
}

// ── Proses Import Excel ──────────────────────────────────────────────
public function proses_import_excel()
{
    // Cek permission
    if (!in_array($this->session->userdata('role'), ['admin', 'ketua_rt', 'sekretaris'])) {
        $this->session->set_flashdata('error', 'Anda tidak memiliki akses untuk fitur ini.');
        redirect('kartu-keluarga');
        return;
    }

    // Validasi file upload
    if (!isset($_FILES['file_excel']) || $_FILES['file_excel']['error'] !== UPLOAD_ERR_OK) {
        $this->session->set_flashdata('error', 'Gagal upload file. Silakan coba lagi.');
        redirect('kartu-keluarga');
        return;
    }

    $file_tmp  = $_FILES['file_excel']['tmp_name'];
    $file_name = $_FILES['file_excel']['name'];
    $ext       = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));

    if (!in_array($ext, ['xlsx', 'xls'])) {
        $this->session->set_flashdata('error', 'Format file tidak valid. Gunakan .xlsx atau .xls');
        redirect('kartu-keluarga');
        return;
    }

    // Load library PhpSpreadsheet (via Composer) atau PhpExcel
    // Pastikan sudah install: composer require phpoffice/phpspreadsheet
    require_once APPPATH . 'vendor/autoload.php';

    try {
        $reader      = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile($file_tmp);
        $reader->setReadDataOnly(true);
        $spreadsheet = $reader->load($file_tmp);
        $sheet       = $spreadsheet->getSheetByName('Import Warga');

        if (!$sheet) {
            // Coba sheet pertama jika nama tidak cocok
            $sheet = $spreadsheet->getActiveSheet();
        }

        $highestRow = $sheet->getHighestRow();

        // Mapping kolom (sesuai template, mulai kolom A=1)
        // A=NO, B=NIK, C=NAMA, D=NO_KK, E=TEMPAT_LAHIR, F=TGL_LAHIR
        // G=JK, H=STATUS_KAWIN, I=PEKERJAAN, J=AGAMA, K=STATUS_HUBUNGAN
        // L=STATUS_DOMISILI, M=KET_DOMISILI, N=USERNAME, O=EMAIL, P=NO_HP

        $berhasil = 0;
        $dilewati = 0;
        $errors   = [];

        // Data mulai dari baris 5 (baris 1-4 = header/panduan)
        // Tapi kita mulai dari baris 5, skip baris kosong
        for ($row = 5; $row <= $highestRow; $row++) {
            $nik          = trim($sheet->getCell('B' . $row)->getValue());
            $nama_lengkap = trim($sheet->getCell('C' . $row)->getValue());
            $no_kk        = trim($sheet->getCell('D' . $row)->getValue());

            // Skip baris kosong atau header
            if (empty($nik) || empty($nama_lengkap) || empty($no_kk)) {
                continue;
            }

            // Skip jika bukan angka (kemungkinan baris contoh/header)
            if (!is_numeric($nik)) {
                continue;
            }

            // Validasi panjang NIK
            if (strlen($nik) !== 16) {
                $errors[] = "Baris {$row}: NIK '{$nik}' harus 16 digit";
                continue;
            }

            // Cek duplikat NIK
            $cek_nik = $this->db->get_where('warga', ['nik' => $nik])->row();
            if ($cek_nik) {
                $dilewati++;
                continue;
            }

            // Ambil data lainnya
            $tempat_lahir        = trim($sheet->getCell('E' . $row)->getValue());
            $tanggal_lahir_raw   = $sheet->getCell('F' . $row)->getValue();
            $jenis_kelamin       = strtoupper(trim($sheet->getCell('G' . $row)->getValue()));
            $status_perkawinan   = strtolower(trim($sheet->getCell('H' . $row)->getValue()));
            $pekerjaan           = trim($sheet->getCell('I' . $row)->getValue());
            $agama               = trim($sheet->getCell('J' . $row)->getValue());
            $status_hubungan     = strtolower(trim($sheet->getCell('K' . $row)->getValue()));
            $status_domisili     = strtolower(trim($sheet->getCell('L' . $row)->getValue()));
            $keterangan_domisili = trim($sheet->getCell('M' . $row)->getValue());
            $username            = trim($sheet->getCell('N' . $row)->getValue());
            $email               = trim($sheet->getCell('O' . $row)->getValue());
            $no_hp               = trim($sheet->getCell('P' . $row)->getValue());

            // Format tanggal lahir
            $tanggal_lahir = null;
            if (!empty($tanggal_lahir_raw)) {
                // Bisa berupa angka serial Excel atau string
                if (is_numeric($tanggal_lahir_raw)) {
                    $tanggal_lahir = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($tanggal_lahir_raw)
                                     ->format('Y-m-d');
                } else {
                    $tanggal_lahir = date('Y-m-d', strtotime($tanggal_lahir_raw));
                    if ($tanggal_lahir === '1970-01-01') $tanggal_lahir = null;
                }
            }

            // Validasi enum
            $valid_jk       = ['L', 'P'];
            $valid_kawin    = ['belum_kawin', 'kawin', 'cerai_hidup', 'cerai_mati', ''];
            $valid_hubungan = ['kepala_keluarga','istri','anak','cucu','orang_tua','mertua','famili_lain','pembantu','lainnya'];
            $valid_domisili = ['tetap','kost','kontrak','pendatang','sementara'];
            $valid_agama    = ['Islam','Kristen','Katolik','Hindu','Buddha','Konghucu'];

            if (!empty($jenis_kelamin) && !in_array($jenis_kelamin, $valid_jk)) {
                $errors[] = "Baris {$row}: Jenis kelamin '{$jenis_kelamin}' tidak valid (gunakan L atau P)";
                continue;
            }
            if (!in_array($status_hubungan, $valid_hubungan)) {
                $status_hubungan = 'lainnya';
            }
            if (!in_array($status_domisili, $valid_domisili)) {
                $status_domisili = 'tetap';
            }
            if (!in_array($status_kawin = $status_perkawinan, $valid_kawin)) {
                $status_kawin = null;
            }

            // ── Cari / buat KK ──
            $kk = $this->db->get_where('kartu_keluarga', ['no_kk' => $no_kk])->row();
            $kk_id = null;
            if ($kk) {
                $kk_id = $kk->id;
            } else {
                // Buat KK baru
                $this->db->insert('kartu_keluarga', [
                    'no_kk'      => $no_kk,
                    'created_at' => date('Y-m-d H:i:s'),
                ]);
                $kk_id = $this->db->insert_id();
            }

            // ── Buat akun user (jika username diisi) ──
            $user_id = null;
            if (!empty($username)) {
                // Cek username sudah ada
                $cek_user = $this->db->get_where('users', ['username' => $username])->row();
                if (!$cek_user) {
                    $password_hash = password_hash($nik, PASSWORD_DEFAULT); // default password = NIK
                    $this->db->insert('users', [
                        'username'     => $username,
                        'password'     => $password_hash,
                        'nama_lengkap' => $nama_lengkap,
                        'email'        => $email ?: null,
                        'no_hp'        => $no_hp ?: null,
                        'role'         => 'warga',
                        'status'       => 'aktif',
                        'created_at'   => date('Y-m-d H:i:s'),
                        'updated_at'   => date('Y-m-d H:i:s'),
                    ]);
                    $user_id = $this->db->insert_id();
                } else {
                    $user_id = $cek_user->id;
                }
            }

            // ── Insert ke tabel warga ──
            $data_warga = [
                'user_id'             => $user_id,
                'kk_id'               => $kk_id,
                'nik'                 => $nik,
                'nama_lengkap'        => $nama_lengkap,
                'no_kk'               => $no_kk,
                'tempat_lahir'        => $tempat_lahir ?: null,
                'tanggal_lahir'       => $tanggal_lahir,
                'jenis_kelamin'       => !empty($jenis_kelamin) ? $jenis_kelamin : null,
                'status_perkawinan'   => !empty($status_kawin) ? $status_kawin : null,
                'pekerjaan'           => $pekerjaan ?: null,
                'agama'               => !empty($agama) && in_array($agama, $valid_agama) ? $agama : null,
                'status_hubungan'     => $status_hubungan,
                'status_domisili'     => $status_domisili,
                'keterangan_domisili' => $keterangan_domisili ?: null,
                'created_at'          => date('Y-m-d H:i:s'),
            ];

           $this->db->insert('warga', $data_warga);
                $warga_id = $this->db->insert_id();

                // Update warga_id di tabel users
                if ($user_id && $warga_id) {
                    $this->db->update('users', ['warga_id' => $warga_id], ['id' => $user_id]);
                }

                // Jika kepala keluarga, update kolom kepala_keluarga_id di KK
                if ($status_hubungan === 'kepala_keluarga') {
                    $this->db->update('kartu_keluarga',
                        ['kepala_keluarga_id' => $warga_id],
                        ['id' => $kk_id]
                    );
                }

                $berhasil++;
        }

    } catch (Exception $e) {
        $this->session->set_flashdata('error', 'Gagal membaca file Excel: ' . $e->getMessage());
        redirect('kartu-keluarga');
        return;
    }

    // Set hasil ke flashdata
    $this->session->set_flashdata('import_result', [
        'berhasil' => $berhasil,
        'dilewati' => $dilewati,
        'errors'   => $errors,
    ]);

    redirect('kartu-keluarga');
}