<?php
/**
 * @author Frank de Lange
 * @copyright 2017 Frank de Lange
 *
 * This file is licensed under the Affero General Public License version 3 or
 * later.
 * See the COPYING-README file.
 */

namespace OCA\Epubreader\Db;

use OCA\Epubreader\Utility\Time;
use OCP\IDBConnection;

class PreferenceMapper extends ReaderMapper {

    public function __construct(IDBConnection $db, $UserId, Time $time) {
        parent::__construct($db, 'reader_prefs', Preference::class, $time);
        $this->userId = $UserId;
    }

    /**
     * @brief get preferences for $scope+$fileId+$userId(+$name)
     *
     * @param string $scope
     * @param int $fileId
     * @param string $name
     * @return array
     */
    public function get($scope, $fileId, $name=null) {
        if(!empty($name)) {
            $sql = "SELECT * FROM `*PREFIX*reader_prefs` WHERE `scope`=? AND `file_id`=? AND `user_id`=? AND `name`=?";
            $args = array(
                $scope,
                $fileId,
                $this->userId,
                $name);
        } else {
            $sql = "SELECT * FROM `*PREFIX*reader_prefs` WHERE `scope`=? AND `file_id`=? AND `user_id`=?";
            $args = array(
                $scope,
                $fileId,
                $this->userId);
        }

        return $this->findEntities($sql, $args);
    }

    /**
     * @brief write preference to database
     *
     * @param string $scope
     * @param int $fileId
     * @param string $name
     * @param string $value
     *
     * @return Preference the newly created or updated preference
     */
    public function set($scope, $fileId, $name, $value) {

        $result = $this->get($scope, $fileId, $name);

        if(empty($result)) {

            $preference = new Preference();
            $preference->setScope($scope);
            $preference->setFileId($fileId);
            $preference->setUserId($this->userId);
            $preference->setName($name);
            $preference->setValue($value);

            $this->insert($preference);
        } else {
            $preference = $result[0];
            $preference->setValue($value);

            $this->update($preference);
        }

        return $preference;
    }

    /* currently not used*/
    public function deleteForFileId($fileId) {
        $sql = "SELECT * FROM `*PREFIX*reader_prefs` WHERE file_id=?";
        $args = [ $fileId ];
        array_map(
            function($entity) {
                $this->delete($entity);
            }, $this->findEntities($sql, $args)
        );
    }

    /* currently not used*/
    public function deleteForUserId($userId) {
        $sql = "SELECT * FROM `*PREFIX*reader_prefs` WHERE user_id=?";
        $args = [ $userId ];
        array_map(
            function($entity) {
                $this->delete($entity);
            }, $this->findEntities($sql, $args)
        );
    }
}