<?php
use Carbon\Carbon;
use Illuminate\Database\Query\Builder;
use Luticate\Utils\Controller\LuticateApplication;
use Illuminate\Database\Capsule\Manager as Capsule;
use Luticate\Utils\DataAccess\LuDataAccess;
use Luticate\Utils\DataAccess\PgSqlDataAccess;
use Luticate\Utils\Dbo\LuDbo;
use Luticate\Utils\Dbo\LuDboDeserializeException;

/**
 * Created by PhpStorm.
 * User: robin
 * Date: 6/7/16
 * Time: 2:57 PM
 */

class TestTableDbo extends LuDbo
{
    /**
     * @var $_id int
     */
    private $_id;

    /**
     * @var $_someText string
     */
    private $_someText;

    /**
     * @var $_someIntegerArray int[]
     */
    private $_someIntegerArray;

    /**
     * @var $_createdAt Carbon
     */
    private $_createdAt;

    /**
     * @return int
     */
    public function getId()
    {
        return $this->_id;
    }

    /**
     * @param int $id
     */
    public function setId($id)
    {
        $this->_id = $id;
    }

    /**
     * @return string
     */
    public function getSomeText()
    {
        return $this->_someText;
    }

    /**
     * @param string $someText
     */
    public function setSomeText($someText)
    {
        $this->_someText = $someText;
    }

    /**
     * @return int[]
     */
    public function getSomeIntegerArray()
    {
        return $this->_someIntegerArray;
    }

    /**
     * @param int[] $someIntegerArray
     */
    public function setSomeIntegerArray($someIntegerArray)
    {
        $this->_someIntegerArray = $someIntegerArray;
    }

    /**
     * @return Carbon
     */
    public function getCreatedAt()
    {
        return $this->_createdAt;
    }

    /**
     * @param Carbon $createdAt
     */
    public function setCreatedAt($createdAt)
    {
        $this->_createdAt = $createdAt;
    }

}

class TestTableDboArray extends LuDbo
{
    /**
     * @var TestTableDbo[]
     */
    protected $_array;
    public function getArray()
    {
        return $this->_array;
    }
    public function setArray($value)
    {
        $this->_array = $value;
    }

    public function jsonSerialize()
    {
        return $this->_array;
    }

    public static function jsonDeserialize($json)
    {
        if (!is_array($json)) {
            throw new LuDboDeserializeException("Invalid array value");
        }
        $dbo = new static();
        $array = [];
        foreach ($json as $data) {
            $array[] = TestTableDbo::jsonDeserialize($data);
        }
        $dbo->setArray($array);
        return $dbo;
    }

    public static function generateSample()
    {
        return [
            TestTableDbo::generateSample(),
            TestTableDbo::generateSample()
        ];
    }

}

class TestTableDataAccess extends LuDataAccess
{
    protected static $_connection = "mydb";
    protected static $_table = "test_table";
    protected static $_dboClass = TestTableDbo::class;
    protected static $_dboArrayClass = TestTableDboArray::class;
}

class DatabaseTest extends \PHPUnit_Framework_TestCase
{
    public function testSetup()
    {
//        $config = ['databases' => [
//            [
//                'name'      => 'mydb',
//                'driver'    => 'pgsql',
//                'host'      => '172.17.0.1',
//                'database'  => 'luticate2',
//                'username'  => 'dev',
//                'password'  => 'dev'
//            ]
//        ]];
//        $app = new LuticateApplication($config);
//        $app->setupDatabases();
//
//        $dbo = new TestTableDbo();
//        $dbo->setId(11);
//        $dbo->setSomeIntegerArray('{}');
//        $dbo->setSomeText("lol2");
//
//        var_dump(TestTableDataAccess::getMultiple(function(Builder $q)
//        {
//            return $q->where("id", "=", 1);
//        })[0]->jsonSerialize());
//        var_dump(TestTableDataAccess::getSingleById(1));
//        var_dump(TestTableDataAccess::deleteMultiple(function($q)
//        {
//            return $q->where("some_text", "=", "lol");
//        }));
//        var_dump(TestTableDataAccess::addSingleId($dbo));
//        var_dump(TestTableDataAccess::addSingle($dbo, ['Id']));
//        var_dump(TestTableDataAccess::editSingleById($dbo));
//        var_dump(TestTableDataAccess::editMultiple($dbo, function($q)
//        {
//            return $q->where("some_text", "like", "lol%");
//        }, ['Id']));


//        $pdo = TestTableDataAccess::getPdo();
//        $pgsql = new PgSqlDataAccess();
//        $pgsql->getStoredProceduresFull($pdo);
//        var_dump($pgsql->getStoredProceduresFull($pdo));
    }
}