<?php
namespace app\model;

use \Exception;

class MySqlite
{
    private $mydb;
    protected $tablename;

    public function __construct()
    {
        $mydb = new \SQLite3(DB . DIRECTORY_SEPARATOR . 'mysqlitedb.sqlite');
        if (!$mydb) {
            throw new \Exception("$mydb->lastErrorMsg()", 1);
        } else {
            // echo "Opened database successfully\n";
            $this->mydb = $mydb;
        }
    }

    /**
     * 执行sql
     * @param string $sql
     * @return mixd $res
     */
    public function exec($sql)
    {
        @$res = $this->mydb->exec($sql);
        return $res;
    }

    public function query($sql)
    {
        $result = $this->mydb->query($sql);
        return $result;
    }
    
    public function lastInsertRowID ()
    {
        $result = $this->mydb->lastInsertRowID();
        return $result;
    }

    public function lastErrorMsg()
    {
        return $this->mydb->lastErrorMsg();
    }

    /**
     * 查询数组列表
     */
    public function select($sql)
    {
        $result = $this->mydb->query($sql);
        $data = array();
        // var_dump($result);exit;
        while ($arr = $result->fetchArray(SQLITE3_ASSOC)) {
            $data[] = $arr;
        }
        return $data;
    }

    /**
     * 查询一条
     */
    public function getOneById($id, $tablename='')
    {
        $tablename = $tablename ? $tablename : $this->tablename;
        $sql = "SELECT * FROM `$tablename` WHERE `id`=$id;";
        $result = $this->mydb->query($sql);
        // var_dump($result);
        $data = $result->fetchArray(SQLITE3_ASSOC);
        // var_dump($data);
        return $data;
    }

    public function getOne($sql = "")
    {
        $result = $this->mydb->query($sql);
        // var_dump($result);
        $data = $result->fetchArray(SQLITE3_ASSOC);
        // var_dump($data);
        return $data;
    }

    /**
     * 单列合计
     */
    public function sumColumn($column, $tablename)
    {
        $tablename = $tablename ? $tablename : $this->tablename;
        $sql = "SELECT sum(`$column`) as sumData FROM `$tablename`;";
        $result = $this->mydb->query($sql);
        // $data = $result->fetchArray();
        // var_dump($data['sumData']);exit;
        if ($data = $result->fetchArray(SQLITE3_ASSOC)) {
            return $data['sumData'];
        }
        return 0;
    }

    /**
     * 列表结果集
     */
    public function dataList($where='', $order= '', $desc = false, $limit = 0)
    {
        if ($order) {
            $where .= " order by $order";
            if ($desc) {
                $where .= " desc";
            } else {
                $where .= " asc";
            }
        }

        if ($limit) {
            $where .= " limit " . $limit;
        }

        $sql = "select * from $this->tablename $where;";
        
        return $this->select($sql);
    }

    /**
     * 分页结果
     */
    public function pageList($where, $page = 1, $limit = 10)
    {
        $res = $this->query("select count(*) as total from $this->tablename $where;"); 
        $data = $res->fetchArray(SQLITE3_ASSOC);
        
        $offset = ($page - 1) * $limit;
        $sql = "select * from $this->tablename $where limit $offset, $limit;";
        $list = $this->select($sql);
        $data['list'] = $list;
        $data['page'] = $page;
        $data['limit'] = $limit;
        
        return $data;
    }
    
    public function listByName($name='', $order = '', $desc = false)
    {
        $where = "";
        if ($name) {
            $where = " where name like '%$name%'";
        }

        if ($order) {
            $where .= " order by $order";
            if ($desc) {
                $where .= " desc";
            } else {
                $where .= " asc";
            }
        }
        $sql = "select * from $this->tablename $where;";
        $res = $this->select($sql);

        return $res;
    }

    /**
     * save
     */
    public function save($data)
    {
        $columns = "";
        $values = "";
        foreach ($data as $key => $value) {
            $columns .=  "`" . $key . "`,";
            $values .=  "'" . $value . "',";
        }
        
        $columns = rtrim($columns, ',');
        
        $values = rtrim($values, ',');
        
        $sql = "INSERT INTO `$this->tablename`(" . $columns . ") VALUES(". $values . ");";

        if ($this->exec($sql)) {
            return true;
        } else {
            throw new Exception("Error SQL Request", 1);   
        }
    }
    
    /**
     * updateById
     */
    public function updateById($data)
    {
        $id = $data['id'];
        unset($data['id']);
        $columns = "";
        foreach ($data as $key => $value) {
            $columns .= "`" . $key . "`='" . $value ."',";
        }
        $columns = rtrim($columns, ',');
        
        $sql = "UPDATE `$this->tablename` SET $columns WHERE `id`=$id";

        if ($this->exec($sql)) {
            return true;
        } else {
            throw new Exception("Error SQL Request", 1);   
        }
    }

    /**
     * deleteByIds
     */
    public function deleteById($id)
    {
        if (is_array($id)) {
            $sql = "DELETE FROM `$this->tablename` WHERE `id` IN(";
            for ($i=0; $i < count($id); $i++) { 
                $sql .= $id[$i] . ',';
            }
            $sql = rtrim($sql, ',');
            $sql .= ");";
        } else {
            $sql = "DELETE FROM `$this->tablename` WHERE `id`=$id;";
        }
        return $this->exec($sql);
    }

    public function __destruct()
    {
        $this->mydb->close();
    }
}