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

/**
 * @property CI_DB $db
 * @property CI_Input $input
 * @property CI_Output $output
 */
class Paket extends CI_Controller {

    private $tableMaster = 'paket_atv';
    private $tableFoto = 'foto_paket';
    private $tableAddon = 'paket_addon';

    public function __construct() {
        parent::__construct();
        $this->load->database();
        $this->output->set_content_type('application/json');
    }

    // Tangkap semua request
    public function _remap($method, $params = []) {
        if(method_exists($this, $method)){
            return call_user_func_array([$this, $method], $params);
        }
        echo json_encode(['status'=>'error','message'=>'Method tidak ditemukan']);
    }

    private function getJsonInput() {
        $data = json_decode(file_get_contents('php://input'), true);
        if (!$data) {
            echo json_encode([
                'status' => false,
                'message' => 'JSON kosong atau tidak valid'
            ]);
            exit;
        }
        return $data;
    }

    private function insertFotoList($kode_produk, $fotoList) {
        foreach ($fotoList as $i => $fotoBase64) {
            if (!$fotoBase64) continue;
            $this->db->insert($this->tableFoto, [
                'kode_produk' => $kode_produk,
                'foto' => $fotoBase64,
                'urutan' => $i + 1
            ]);
        }
    }
public function insert() {
    $data = $this->getJsonInput();

    $fotoList  = $data['foto_list'] ?? [];
    $addonList = $data['addon_list'] ?? [];

    unset($data['foto_list'], $data['addon_list']);

    $kode_produk = $data['kode_produk'] ?? null;

    // AUTO GENERATE kode_produk (PREFIX + 5 DIGIT ANGKA)
    if (!$kode_produk) {
        $prefix = 'PKT-'; // huruf kode di depan

        do {
            $kode_produk = $prefix . str_pad(mt_rand(0, 99999), 5, '0', STR_PAD_LEFT);
            $cek = $this->db->get_where($this->tableMaster, [
                'kode_produk' => $kode_produk
            ])->row_array();
        } while ($cek);

        $data['kode_produk'] = $kode_produk;
    }

    if (!$this->db->insert($this->tableMaster, $data)) {
        echo json_encode([
            'status'   => false,
            'message'  => 'Gagal insert paket',
            'db_error' => $this->db->error()
        ]);
        return;
    }

    // SIMPAN ADDON
    foreach ($addonList as $addon) {
        $this->db->insert($this->tableAddon, [
            'kode_produk'      => $kode_produk,
            'nama_addon'       => $addon['nama_addon'] ?? '',
            'deskripsi_addon'  => $addon['deskripsi_addon'] ?? ''
        ]);
    }

    // SIMPAN FOTO
    $this->insertFotoList($kode_produk, $fotoList);

    echo json_encode([
        'status'       => true,
        'message'      => 'Paket, foto, dan addon berhasil disimpan',
        'kode_produk'  => $kode_produk
    ]);
}

/**
 * Method khusus untuk upload foto satu per satu (optional)
 * Bisa dipanggil dari client jika Base64 terlalu besar
 */
public function insertFoto($kode_produk = null) {
    if (!$kode_produk) {
        echo json_encode(['status'=>false,'message'=>'kode_produk wajib di URL']);
        return;
    }

    $data = $this->getJsonInput();
    $fotoList = $data['foto_list'] ?? [];

    $jumlahFotoSukses = 0;
    foreach ($fotoList as $i => $fotoBase64) {
        if (!$fotoBase64) continue;

        $insertFoto = $this->db->insert($this->tableFoto, [
            'kode_produk' => $kode_produk,
            'foto'       => $fotoBase64,
            'urutan'     => $i + 1
        ]);

        if ($insertFoto) $jumlahFotoSukses++;
    }

    echo json_encode([
        'status'        => true,
        'message'       => 'Foto berhasil disimpan',
        'kode_produk'    => $kode_produk,
        'jumlah_foto'   => $jumlahFotoSukses
    ]);
}










public function get() {

    $masterData = $this->db->get($this->tableMaster)->result_array();
    $result = [];

    foreach ($masterData as $paket) {

        // FOTO
        $fotoList = $this->db
            ->where('kode_produk', $paket['kode_produk'])
            ->order_by('urutan', 'ASC')
            ->get($this->tableFoto)
            ->result_array();

        $paket['foto_list'] = array_column($fotoList, 'foto');

        // ADDON
        $addonList = $this->db
            ->where('kode_produk', $paket['kode_produk'])
            ->get($this->tableAddon)
            ->result_array();

        $paket['addon_list'] = $addonList;

        $result[] = $paket;
    }

    echo json_encode([
        'status'  => true,
        'message' => 'Data paket berhasil diambil',
        'data'    => $result
    ]);
}








public function update($kode_produk = null) {
    if (!$kode_produk) {
        echo json_encode(['status' => false, 'message' => 'kode_produk wajib disertakan di URL']);
        return;
    }

    $data = $this->getJsonInput();

    // Ambil foto dan addon, lalu hapus dari data utama
    $fotoList  = $data['foto_list']  ?? [];
    $addonList = $data['addon_list'] ?? [];
    unset($data['foto_list'], $data['addon_list']);

    // Update data master paket
    $this->db->where('kode_produk', $kode_produk);
    if (!$this->db->update($this->tableMaster, $data)) {
        echo json_encode([
            'status'   => false,
            'message'  => 'Gagal update paket ATV',
            'db_error' => $this->db->error()
        ]);
        return;
    }

    // Hapus dan update foto
    $this->db->where('kode_produk', $kode_produk)->delete($this->tableFoto);
    $this->insertFotoList($kode_produk, $fotoList);

    // Hapus dan update addon
    $this->db->where('kode_produk', $kode_produk)->delete($this->tableAddon);
    foreach ($addonList as $addon) {
        $this->db->insert($this->tableAddon, [
            'kode_produk'      => $kode_produk,
            'nama_addon'      => $addon['nama_addon'] ?? '',
            'deskripsi_addon' => $addon['deskripsi_addon'] ?? ''
        ]);
    }

    echo json_encode([
        'status'       => true,
        'message'      => 'Data paket ATV berhasil diupdate',
        'kode_produk'   => $kode_produk,
        'jumlah_foto'  => count($fotoList),
        'jumlah_addon' => count($addonList)
    ]);
}

    public function delete($kode_produk = null) {
        if (!$kode_produk) {
            echo json_encode(['status'=>false,'message'=>'kode_produk wajib disertakan di URL']);
            return;
        }

        $this->db->where('kode_produk', $kode_produk)->delete($this->tableFoto);
        $this->db->where('kode_produk', $kode_produk)->delete($this->tableAddon);
        $this->db->where('kode_produk', $kode_produk);
        if (!$this->db->delete($this->tableMaster)) {
            echo json_encode(['status'=>false,'message'=>'Gagal menghapus paket ATV','db_error'=>$this->db->error()]);
            return;
        }

        echo json_encode([
            'status' => true,
            'message' => 'Data paket ATV, addon, dan foto terkait berhasil dihapus',
            'kode_produk' => $kode_produk
        ]);
    }
}
