<?php namespace App\Controllers;
/**
 * File			: User.php
 * Description  : Controller untuk halaman user
 * Created By	: Hendi
 * Created Date : 11 Feb 2021
 * Last Update  : 06 Apr 2021
**/
use App\Models\UserModel;
use CodeIgniter\Config\Services;

class User extends MyBaseController
{
	private $UserModel;
	public function __construct()
	{
		parent::__construct();
		// Modelnya diload langsung di construct
		// agar create object hanya sekali saja
		$this->UserModel = new UserModel();
	}
	
	public function index()
	{
		# fn isLoggedIn di MyBaseController
		if (!$this->isLoggedIn()) return redirect()->to(base_url('login'));
		# jika sudah menu dinamis diisi dari array hasil query
		$data_sidebar = []; 
		# jika dibutuhkan data untuk konten
		$data_content = [
			'mod' => 'user',
		];
		$data = [
			'title' => 'User',
			'sidebar' => view('contents/sidebar', $data_sidebar),
			'content' => view('contents/user/user_list', $data_content),
		];
		return view('templates/index', $data);
	}
	
	public function addData()
    {
		# fn isLoggedIn di MyBaseController
		if (!$this->isLoggedIn()) return redirect()->to(base_url('login'));
		# jika sudah menu dinamis diisi dari array hasil query
		$data_sidebar = []; 
		# jika dibutuhkan data untuk konten
		$data_content = [
			'mod' => 'user',
			'sts' => 'add',
			'level' => $this->UserModel->db->query("SELECT * FROM level")->getResultArray()
		];
		$data = [
			'title' => 'User',
			'sidebar' => view('contents/sidebar', $data_sidebar),
			'content' => view('contents/user/user_form', $data_content),
		];
		return view('templates/index', $data);
	}
	
	public function editData($id)
    {
		# fn isLoggedIn di MyBaseController
		if (!$this->isLoggedIn()) return redirect()->to(base_url('login'));
		# jika sudah menu dinamis diisi dari array hasil query
		$data_sidebar = []; 
		# jika dibutuhkan data untuk konten
		$data_content = [
			'mod' => 'user',
			'sts' => 'edit',
			'level' => $this->UserModel->db->query("SELECT * FROM level")->getResultArray(),
			'user_data' => $this->UserModel->where('user_id', $id)->first()
		];
		$data = [
			'title' => 'User',
			'sidebar' => view('contents/sidebar', $data_sidebar),
			'content' => view('contents/user/user_form', $data_content),
		];
		return view('templates/index', $data);
	}
	
	public function saveData()
    {
		# rc = result code, rd = result description
		# jika pakai AJAK POST sertakan token csrf baru dalam respon agar tidak error saat submit
		# jika diaktifkan csrfnya di Config/Filters.php
		if (!$this->isLoggedIn()) return json_encode(['rc' => '0', 'rd' => 'User gagal disimpan. Anda belum login.', 'csrf_name' => 'X-CSRF-TOKEN', 'csrf_content' => (Services::security())->getCSRFHash()]); 
        
		# agar cepat, pakai metode foreach.
		# keterangan lengkap di Controllers/Tag.php
		$post = [];
		foreach($_POST as $k => $v) $post[$k] = $this->request->getPost($k);
			
		# roles 'user' sudah didefinisikan di Config/Validation.php
		if ($this->form_validation->run($post, 'user') === FALSE) 
		{
		    # pesan error validasi disimpan di respon json karena pake ajax
			return json_encode(['rc' => '0', 'rd' => 'User gagal disimpan.', 'errors' => $this->form_validation->getErrors(), 'csrf_name' => 'X-CSRF-TOKEN', 'csrf_content' => (Services::security())->getCSRFHash()]); 
		}
		else
		{
			$sts = $post['sts'];
			$id = $post['user_id'];
			# tidak disertakan dalam validasi / penyimpanan
			unset($post['sts']);
			unset($post['csrf_token_name']);
				//echo $sts;exit;		
			# jika satu baris saja boleh tanpa tanda {}
			if ($sts == 'add') 
			{
				# cek user_id, tidak pake is_unique di validation
				# soalnya user_id bukan int auto increment
				# jadi error tidak bisa simpan saat edit data
				if ($this->UserModel->cekUserID($id) > 0) return json_encode(['rc' => '0', 'rd' => 'User gagal disimpan.', 'errors' => ['user_id'=> 'User ID tersebut sudah digunakan'], 'csrf_name' => 'X-CSRF-TOKEN', 'csrf_content' => (Services::security())->getCSRFHash()]); 
					
				# saat tambah user, password default 123
				# nanti diubah sendiri
				$post['password'] = password_hash("123", PASSWORD_DEFAULT);
				# menggunakan insert
				# karena jika menggunakan save, akan dianggap UPDATE, soalnya user_id nya sudah ada diinput
				# $returnID = false, agar nilai kembalian bukan user_id tapi result boolean
				$res = $this->UserModel->insert($post, false); # (data, returnID)
			}
			else 
				$res = $this->UserModel->update($id, $post);
				
			# memberikan pesan, pake ul jadi pake []
			if ($res) #true
				return json_encode(['rc' => '1', 'rd' => 'User berhasil disimpan.', 'csrf_name' => 'X-CSRF-TOKEN', 'csrf_content' => (Services::security())->getCSRFHash()]); 
			else
				return json_encode(['rc' => '0', 'rd' => 'User gagal disimpan.', 'csrf_name' => 'X-CSRF-TOKEN', 'csrf_content' => (Services::security())->getCSRFHash()]); 
		}
	}
	
	public function deleteData()
    {
        if (!$this->isLoggedIn()) return json_encode(['rc' => '0', 'rd' => 'Anda belum login']);
		$post = [];
		foreach($_POST as $k => $v) $post[$k] = $this->request->getPost($k);
		
		# cek jika sudah ada input transaksi
		$cek = $this->UserModel->cekTrxData($post['id']);
		if ($cek > 0)
			return json_encode(['rc' => '0', 'rd' => 'Data gagal dihapus. User tersebut sudah input '.$cek.' transaksi. Silakan hapus dulu transaksinya.']); 
		
		# hapus permanen tidak soft delete
		$res = $this->UserModel->delete($post['id']);
		if ($res) #true
			return json_encode(['rc' => '1', 'rd' => 'Data berhasil dihapus.']); 
		else 
			return json_encode(['rc' => '0', 'rd' => 'Data gagal dihapus']);
	}
}
