<?php
namespace App\Controllers;

use App\Models\TokoModel;
use App\Models\MenuModel;
use App\Models\PelangganModel;
use App\Models\HomeSettingModel;
use App\Models\HomeSliderModel;
use App\Models\HomeProductModel;
use App\Models\LowonganModel;
use App\Models\PelamarModel;

use Config\Database;

class Home extends BaseController
{
    protected $tokoModel;
    protected $menuModel;
    protected $dbPos;

    public function __construct()
    {
        $this->tokoModel = new TokoModel();

        $this->dbPos = Database::connect('posDB');
        $this->menuModel = new MenuModel($this->dbPos);
    }
    
    private function getListToko()
    {
        $outlets = $this->tokoModel->where('stat', 2)
            ->where('kd_toko !=', 'YOG09')
            ->findAll();

        $settingModel = new HomeSettingModel();
        $hiddenSetting = $settingModel->where('key_name', 'hidden_outlets')->first();
        $hiddenOutlets = $hiddenSetting ? json_decode($hiddenSetting['value_text'], true) : [];
        
        if (!is_array($hiddenOutlets)) $hiddenOutlets = [];

        if (!empty($hiddenOutlets)) {
            $outlets = array_filter($outlets, function($ot) use ($hiddenOutlets) {
                // Cek kd_toko baik dalam format Object maupun Array
                $kd = is_object($ot) ? $ot->kd_toko : $ot['kd_toko'];
                return !in_array($kd, $hiddenOutlets);
            });
            $outlets = array_values($outlets); 
        }

        return $outlets;
    }

    public function index(): string
    {
        $data['list_toko'] = $this->getListToko();

        $settingModel = new HomeSettingModel();
        $settingsRaw = $settingModel->findAll();
        $settings = [];
        foreach ($settingsRaw as $s) {
            $settings[$s['key_name']] = $s['value_text'];
        }

        $data['settings'] = $settings;
        $data['sliders'] = (new HomeSliderModel())->findAll();
        $data['products'] = (new HomeProductModel())->findAll();

        return view('home', $data);
    }


    public function menu(): string
    {
        $data['list_toko'] = $this->getListToko();
        $menuData = $this->menuModel->getMenuData();
        $settingModel = new HomeSettingModel();
        $configRaw = $settingModel->where('key_name', 'web_menu_config')->first();
        $webConfig = $configRaw ? json_decode($configRaw['value_text'], true) : [];

        foreach ($menuData as $kdjenis => &$kategori) {
            if (!empty($kategori['items'])) {
                foreach ($kategori['items'] as $index => &$item) {
                    
                    $kode = isset($item['kode_menu']) ? $item['kode_menu'] : (isset($item['kdmenu']) ? $item['kdmenu'] : null);

                    if ($kode) {
                        $isHidden = isset($webConfig[$kode]['is_hidden']) ? $webConfig[$kode]['is_hidden'] : false;

                        if ($isHidden) {
                                unset($kategori['items'][$index]);
                            continue;
                        }

                        if (!empty($webConfig[$kode]['nama_menu'])) {
                            $item['nama_menu'] = $webConfig[$kode]['nama_menu'];
                        }
                        if (!empty($webConfig[$kode]['foto'])) {
                            $item['foto'] = $webConfig[$kode]['foto'];
                        }
                    }
                }
                $kategori['items'] = array_values($kategori['items']);
            }
        }
        $data['menuData'] = $menuData;
        
        return view('menu', $data);
    }

    public function kedai(): string
    {
        $data['list_toko'] = $this->getListToko();
        return view('kedai', $data);
    }

    public function about(): string
    {
        $pelangganModel = new PelangganModel();

        $data['list_toko'] = $this->getListToko();
        $data['menuData'] = $this->menuModel->getMenuData();

        $data['total_pelanggan'] = $pelangganModel->countAllResults();
        $data['total_cabang'] = $this->tokoModel->where('stat', 2)->where('kd_toko !=', 'YOG09')->countAllResults();
        $data['total_menu'] = $this->dbPos->table('tabel_menu')->countAllResults();

        $settingModel = new HomeSettingModel();
        $settingsRaw = $settingModel->findAll();
        $settings = [];
        foreach ($settingsRaw as $s) {
            $settings[$s['key_name']] = $s['value_text'];
        }
        $data['settings'] = $settings; 

        return view('about', $data);
    }
    
   public function berita(): string
    {
        $data['list_toko'] = $this->getListToko();
        $data['menuData'] = $this->menuModel->getMenuData();
        
        // Ambil data JSON berita
        $settingModel = new \App\Models\HomeSettingModel();
        $settingsRaw = $settingModel->findAll();
        $settings = [];
        foreach ($settingsRaw as $s) {
            $settings[$s['key_name']] = $s['value_text'];
        }

        $today = date('Y-m-d');

        if (isset($settings['pengumuman_list'])) {
            $pengumuman = json_decode($settings['pengumuman_list'], true);
            if (is_array($pengumuman)) {
                $filteredPengumuman = array_filter($pengumuman, function($p) use ($today) {
                    $isActive = isset($p['status']) ? $p['status'] : '1'; // Default 1 (Aktif)
                    $isExpired = (!empty($p['end_date']) && $p['end_date'] < $today); // Cek Kadaluarsa
                    return ($isActive == '1' && !$isExpired);
                });
                $settings['pengumuman_list'] = json_encode(array_values($filteredPengumuman));
            }
        }

        if (isset($settings['berita_list'])) {
            $berita = json_decode($settings['berita_list'], true);
            if (is_array($berita)) {
                $filteredBerita = array_filter($berita, function($b) use ($today) {
                    $isActive = isset($b['status']) ? $b['status'] : '1';
                    $isExpired = (!empty($b['end_date']) && $b['end_date'] < $today);
                    return ($isActive == '1' && !$isExpired);
                });
                $settings['berita_list'] = json_encode(array_values($filteredBerita));
            }
        }

        $data['settings'] = $settings;

        return view('berita', $data);
    }

    public function galery(): string
    {
        $data['list_toko'] = $this->getListToko();
        $data['menuData'] = $this->menuModel->getMenuData();
        
        $settingModel = new HomeSettingModel();
        $galeriRaw = $settingModel->where('key_name', 'galeri_list')->first();
        $data['galeriList'] = $galeriRaw ? json_decode($galeriRaw['value_text'], true) : [];

        return view('galery', $data);
    }

    public function uploadGaleriPengunjung()
    {
        $settingModel = new HomeSettingModel();
        $galeriRaw = $settingModel->where('key_name', 'galeri_list')->first();
        $galeriList = $galeriRaw ? json_decode($galeriRaw['value_text'], true) : [];

        $fileImg = $this->request->getFile('foto_pengunjung');
        if ($fileImg && $fileImg->isValid() && !$fileImg->hasMoved()) {
            
            $uploadPath = FCPATH . 'assets/img/gb_galery';
            if (!is_dir($uploadPath)) mkdir($uploadPath, 0777, true);

            $newName = $fileImg->getRandomName();
            if ($fileImg->move($uploadPath, $newName)) {
                
                $galeriList[] = [
                    'id'     => uniqid(),
                    'title'  => trim($this->request->getPost('judul_foto') ?? 'Momen Pengunjung'),
                    'desc'   => trim($this->request->getPost('deskripsi_foto') ?? ''),
                    'img'    => $newName,
                    'source' => trim($this->request->getPost('nama_pengunjung') ?? 'Pengunjung')
                ];

                $newValue = json_encode($galeriList);
                if ($galeriRaw) {
                    $settingModel->where('key_name', 'galeri_list')->set(['value_text' => $newValue])->update();
                } else {
                    $settingModel->insert(['key_name' => 'galeri_list', 'value_text' => $newValue]);
                }

                session()->setFlashdata('success_upload', 'Terima kasih! Momen Anda berhasil ditambahkan ke Galeri.');
            } else {
                session()->setFlashdata('error_upload', 'Maaf, terjadi kesalahan saat mengunggah foto.');
            }
        } else {
            session()->setFlashdata('error_upload', 'File foto tidak valid atau terlalu besar.');
        }

        return redirect()->to('/galery');
    }

    public function karir(): string
    {
        $data['list_toko'] = $this->getListToko();
        $data['menuData'] = $this->menuModel->getMenuData();
        
        $lowonganModel = new LowonganModel();
        $data['karirList'] = $lowonganModel->where('is_active', 1)
                                          ->orderBy('created_at', 'DESC')
                                          ->findAll();
    
        return view('karir', $data);
    }
    public function applyJob()
    {
        $pelamarModel = new PelamarModel();
        $fileBerkas = $this->request->getFile('berkas');
        
        if ($fileBerkas && $fileBerkas->isValid() && !$fileBerkas->hasMoved()) {
            $uploadPath = FCPATH . 'uploads/pelamar';
            if (!is_dir($uploadPath)) mkdir($uploadPath, 0777, true);
    
            $safeName = preg_replace('/[^a-zA-Z0-9-_\.]/', '_', $this->request->getPost('nama_pelamar'));
            $newName = time() . '_' . $safeName . '.' . $fileBerkas->getExtension();
            
            if ($fileBerkas->move($uploadPath, $newName)) {
                // SIMPAN KE TABEL data_pelamar
                $pelamarModel->insert([
                    'lowongan_id' => $this->request->getPost('lowongan_id'), // Pastikan ID lowongan terkirim
                    'nama'        => trim($this->request->getPost('nama_pelamar')),
                    'email'       => trim($this->request->getPost('email_pelamar')),
                    'telepon'     => trim($this->request->getPost('telp_pelamar')),
                    'berkas'      => $newName,
                    'status'      => 'pending',
                    'tgl_apply'   => date('Y-m-d H:i:s')
                ]);
    
                session()->setFlashdata('success_apply', 'Lamaran berhasil dikirim!');
            } else {
                session()->setFlashdata('error_apply', 'Gagal mengunggah berkas.');
            }
        }
        return redirect()->to('/karir');
    }
}