<?php

use SleekDB\Store;
use SleekDB\Query;

class SleekDbStore extends Store
{
    // model ini berhubungan dengan SleekDB Store
    // untuk menyimpan documents
    private $params = [];

    public function __construct($store) {
        // inisialisasi store

        // default configurations
        $configuration = [
            "auto_cache" => true,
            "cache_lifetime" => null,
            "timeout" => false,
            "primary_key" => "_id",
            "search" => [
            "min_length" => 2,
            "mode" => "or",
            "score_key" => "scoreKey",
            "algorithm" => Query::SEARCH_ALGORITHM["hits"]
            ]
        ];
        parent::__construct($store, getenv('STRANASPK_SLEEKDB'), $configuration);
    }

    private function alterSpecialParamValue($key, $value) {
        // alter special value, 
        // precondition: single value only, not in array

        if (is_array($value)) // kalau array
            return $this->alterSpecialParamValueInArray($key, $value);
        // special parameter value
        if ($value === 'true')
            return true;
        if ($value === 'false')
            return false;
        if ($value === 'null')
            return null;
        if ($key === '_id')
            return intval($value);
        return $value;
    }

    private function alterSpecialParamValueInArray($key, $values) {
        // alter special values, if the values are in array

        if (!is_array($values)) // kalau bukan array
            return $this->alterSpecialParamValue($key, $values);

        // alter the special values
        $alteredValues = [];
        foreach($values as $value) {
            $alteredValues[] = $this->alterSpecialParamValue($key, $value);
        }
        return $alteredValues;
    }

    public function prepareFetchParams($request) {
        // mengembalikan parameter yang disiapkan untuk select document
        foreach($request as $key=>$value) {
            $key = str_replace(":", ".", $key); // untuk keperluan deep WHERE query
            if (is_array($value)) {
                $value = $this->alterSpecialParamValueInArray($key, $value);
                $this->params[] = [$key, 'in', $value];
            } else {
                $value = $this->alterSpecialParamValue($key, $value); // untuk nilai-nilai khusus
                $likeConditionExist = strpos($value, "%");
                if ($likeConditionExist > -1) {
                    $this->params[] = [$key, 'like', $value];
                } else {
                    $this->params[] = [$key, '=', $value];
                }
            }
        }
    }

    public function fetch($orderBy = null, $limit = null, $offset = null) {
        // fetching documents
        // precondition: $this->params sudah disiapkan melalui $this->prepareFetchParams()

        // syarat mutlak: agar document dengan field 'is_deleted' tidak diambil
        $this->params[] = [
            function($document){
                return !isset($document['is_deleted']);
            }
        ];
        return parent::findBy($this->params, $orderBy, $limit, $offset);
    }
}