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

class Pengguna extends Auth_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->model('User_model');
        $this->load->library('form_validation');

        // Hanya superadmin yang bisa akses
        if ($this->session->userdata('role') !== 'SUPERADMIN') {
            $this->session->set_flashdata('error', 'Akses ditolak. Hanya Superadmin yang dapat mengelola pengguna.');
            redirect('dashboard');
        }
    }

    public function index()
    {
        $users = $this->User_model->get_all();
        $this->render('pengaturan/pengguna/list', [
            'title' => 'Manajemen Pengguna',
            'users' => $users,
        ]);
    }

    public function tambah()
    {
        $this->render('pengaturan/pengguna/form', [
            'title'  => 'Tambah Pengguna',
            'action' => 'tambah',
            'user'   => null,
        ]);
    }

    public function edit($id)
    {
        $user = $this->User_model->get_by_id((int) $id);
        if (!$user) {
            show_404();
        }

        $this->render('pengaturan/pengguna/form', [
            'title'  => 'Edit Pengguna',
            'action' => 'edit',
            'user'   => $user,
        ]);
    }

    public function simpan()
    {
        if (!$this->input->is_ajax_request()) {
            redirect('pengaturan/pengguna');
        }

        $id     = (int) $this->input->post('id_user');
        $is_new = ($id === 0);

        $username     = trim($this->input->post('username'));
        $nama_lengkap = trim($this->input->post('nama_lengkap'));
        $role         = $this->input->post('role');
        $password     = $this->input->post('password');

        // Validasi manual
        $errors = [];
        if (empty($username)) {
            $errors[] = 'Username wajib diisi.';
        } elseif ($this->User_model->username_exists($username, $is_new ? null : $id)) {
            $errors[] = 'Username sudah digunakan.';
        }
        if (empty($nama_lengkap)) {
            $errors[] = 'Nama lengkap wajib diisi.';
        }
        if (!in_array($role, ['SUPERADMIN', 'ADMIN_PAYROLL', 'VIEWER'])) {
            $errors[] = 'Role tidak valid.';
        }
        if ($is_new && empty($password)) {
            $errors[] = 'Password wajib diisi untuk pengguna baru.';
        }
        if (!empty($password) && strlen($password) < 6) {
            $errors[] = 'Password minimal 6 karakter.';
        }

        if (!empty($errors)) {
            return $this->output->set_content_type('application/json')
                ->set_output(json_encode(['success' => false, 'message' => implode(' ', $errors)]));
        }

        $data = [
            'username'     => $username,
            'nama_lengkap' => $nama_lengkap,
            'role'         => $role,
        ];
        if (!empty($password)) {
            $data['password'] = $password;
        }

        if ($is_new) {
            $this->User_model->insert_user($data);
            $msg = 'Pengguna berhasil ditambahkan.';
        } else {
            $this->User_model->update_user($id, $data);
            $msg = 'Pengguna berhasil diperbarui.';
        }

        return $this->output->set_content_type('application/json')
            ->set_output(json_encode(['success' => true, 'message' => $msg]));
    }

    public function toggle_active($id)
    {
        $id = (int) $id;
        // Cegah superadmin menonaktifkan diri sendiri
        if ($id === (int) $this->session->userdata('id_user')) {
            $this->session->set_flashdata('error', 'Anda tidak dapat menonaktifkan akun Anda sendiri.');
            redirect('pengaturan/pengguna');
        }

        $new_status = $this->User_model->toggle_active($id);
        if ($new_status === false) {
            $this->session->set_flashdata('error', 'Pengguna tidak ditemukan.');
        } else {
            $label = $new_status ? 'diaktifkan' : 'dinonaktifkan';
            $this->session->set_flashdata('success', 'Pengguna berhasil ' . $label . '.');
        }
        redirect('pengaturan/pengguna');
    }

    public function reset_password($id)
    {
        if (!$this->input->is_ajax_request()) {
            redirect('pengaturan/pengguna');
        }

        $id           = (int) $id;
        $new_password = trim($this->input->post('new_password'));

        if (strlen($new_password) < 6) {
            return $this->output->set_content_type('application/json')
                ->set_output(json_encode(['success' => false, 'message' => 'Password minimal 6 karakter.']));
        }

        $affected = $this->User_model->reset_password($id, $new_password);
        if (!$affected) {
            return $this->output->set_content_type('application/json')
                ->set_output(json_encode(['success' => false, 'message' => 'Pengguna tidak ditemukan.']));
        }

        return $this->output->set_content_type('application/json')
            ->set_output(json_encode(['success' => true, 'message' => 'Password berhasil direset.']));
    }

    public function hapus($id)
    {
        $id = (int) $id;
        if ($id === (int) $this->session->userdata('id_user')) {
            $this->session->set_flashdata('error', 'Anda tidak dapat menghapus akun Anda sendiri.');
            redirect('pengaturan/pengguna');
        }

        $this->db->where('id_user', $id)->delete('tb_users');
        $this->session->set_flashdata('success', 'Pengguna berhasil dihapus.');
        redirect('pengaturan/pengguna');
    }
}
