<?php

namespace App\Controllers;

use CodeIgniter\Controller;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;

/**
 * BaseController yang ditingkatkan untuk kebutuhan sistem ERP CNC.
 */
abstract class BaseController extends Controller
{
    protected $session;
    protected $db;
    
    /**
     * Data yang akan dikirim secara global ke semua view.
     */
    protected $viewData = [];

    /**
     * An array of helpers to be loaded automatically.
     */
    protected $helpers = ['app', 'form', 'url', 'text', 'date'];

    /**
     * @return void
     */
    public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
    {
        parent::initController($request, $response, $logger);

        $this->session = service('session');
        $this->db      = \Config\Database::connect();
        
        helper($this->helpers);

        // Hanya inject data jika bukan permintaan AJAX/API untuk efisiensi
        if (!$request->isAJAX()) {
            $this->_injectGlobalERPData();
        }
    }

    /**
     * Memuat data global yang dibutuhkan oleh template (Header, Footer, Sidebar)
     */
    private function _injectGlobalERPData()
    {
        // Mengambil data perusahaan dari tabel company_settings
        $company = $this->db->table('company_settings')->limit(1)->get()->getRow();
        $this->viewData['company_profile'] = $company;
        service('renderer')->setVar('company_profile', $company);

        if (is_logged_in()) {
            // Mengambil detail user yang sedang aktif
            $this->viewData['active_user'] = $this->db->table('users')
                ->where('id_user', session()->get('id_user'))
                ->get()
                ->getRow();
            
            // Mengambil notifikasi yang belum dibaca (jika ada fitur notif)
            $this->viewData['unread_notifications'] = $this->db->table('notifications')
                ->where('id_user', session()->get('id_user'))
                ->where('is_read', false)
                ->countAllResults();
        }
    }
}
