<?php
class Services_json {

    function encode($var) {
        return $this->json_encode($var);
    }

    private function json_encode($data) {
        // 1. Handle Tipe NULL
        if (is_null($data)) return 'null';

        // 2. Handle Boolean
        if ($data === true) return 'true';
        if ($data === false) return 'false';

        // 3. Handle Angka Murni (Integer/Float)
        // PENTING: Gunakan is_int/is_float, jangan is_numeric agar string "0812" tetap jadi string
        if (is_int($data) || is_float($data)) {
            return str_replace(',', '.', (string)$data); // Pastikan float pakai titik bukan koma
        }

        // 4. Handle String
        if (is_string($data)) {
            return $this->escape_string($data);
        }

        // 5. Handle Array & Object
        if (is_array($data) || is_object($data)) {
            $is_assoc = false;
            
            // Jika object, ubah ke array dulu
            if (is_object($data)) {
                $data = (array) $data;
                $is_assoc = true; // Object selalu dianggap asosiatif (pakai kurung kurawal)
            } else {
                // Cek apakah array asosiatif (bukan urutan 0, 1, 2...)
                $is_assoc = (array_keys($data) !== range(0, count($data) - 1)) && !empty($data);
            }

            $result = [];
            if ($is_assoc) {
                foreach ($data as $key => $value) {
                    // Key JSON harus selalu string
                    $result[] = '"' . $key . '":' . $this->json_encode($value);
                }
                return '{' . implode(',', $result) . '}';
            } else {
                foreach ($data as $value) {
                    $result[] = $this->json_encode($value);
                }
                return '[' . implode(',', $result) . ']';
            }
        }

        return 'null'; // Default fallback
    }

    // Fungsi khusus untuk membersihkan string agar valid JSON
    private function escape_string($str) {
        $search  = array('\\', '/', '"', "\n", "\r", "\t", "\x08", "\x0c");
        $replace = array('\\\\', '\\/', '\"', '\\n', '\\r', '\\t', '\\b', '\\f');
        return '"' . str_replace($search, $replace, $str) . '"';
    }
}