<?php

Prado::using('System.Data.TDbConnection');

if(!defined('SQLMAP_TESTS'))
	define('SQLMAP_TESTS', realpath(dirname(__FILE__)));

if(!class_exists('Account', false))
{
	include(SQLMAP_TESTS.'/domain/A.php');
	include(SQLMAP_TESTS.'/domain/Account.php');
	include(SQLMAP_TESTS.'/domain/AccountBis.php');
	include(SQLMAP_TESTS.'/domain/AccountCollection.php');
	include(SQLMAP_TESTS.'/domain/B.php');
	include(SQLMAP_TESTS.'/domain/Document.php');
	include(SQLMAP_TESTS.'/domain/Book.php');
	include(SQLMAP_TESTS.'/domain/C.php');
	include(SQLMAP_TESTS.'/domain/Category.php');
	include(SQLMAP_TESTS.'/domain/Complex.php');
	include(SQLMAP_TESTS.'/domain/D.php');
	include(SQLMAP_TESTS.'/domain/DocumentCollection.php');
	include(SQLMAP_TESTS.'/domain/E.php');
	include(SQLMAP_TESTS.'/domain/F.php');
	include(SQLMAP_TESTS.'/domain/LineItem.php');
	include(SQLMAP_TESTS.'/domain/LineItemCollection.php');
	include(SQLMAP_TESTS.'/domain/Newspaper.php');
	include(SQLMAP_TESTS.'/domain/Order.php');
	include(SQLMAP_TESTS.'/domain/Other.php');
	include(SQLMAP_TESTS.'/domain/Sample.php');
	include(SQLMAP_TESTS.'/domain/Search.php');
	include(SQLMAP_TESTS.'/domain/User.php');
}

class DefaultScriptRunner
{
	function runScript($connection, $script)
	{
		$sql = file_get_contents($script);
		$lines = explode(';', $sql);
		foreach($lines as $line)
		{
			$line = trim($line);
			if(strlen($line) > 0)
				$connection->createCommand($line)->execute();
		}
	}
}

class CopyFileScriptRunner
{
	protected $baseFile;
	protected $targetFile;

	public function __construct($base, $target)
	{
		$this->baseFile = $base;
		$this->targetFile = $target;
	}

	function runScript($connection, $script)
	{
		copy($this->baseFile, $this->targetFile);
	}
}

class SQLiteBaseTestConfig extends BaseTestConfig
{
	protected $baseFile;
	protected $targetFile;

	public function __construct()
	{
		$this->_sqlmapConfigFile = SQLMAP_TESTS.'/sqlite.xml';
		$this->_scriptDir = SQLMAP_TESTS.'/scripts/sqlite/';

		$this->targetFile = realpath(SQLMAP_TESTS.'/sqlite/tests.db');
		$this->baseFile = realpath(SQLMAP_TESTS.'/sqlite/backup.db');
		$file = realpath($this->targetFile);
		$this->_connection = new TDbConnection("sqlite:{$file}");
	}

	public function getScriptRunner()
	{
		return new CopyFileScriptRunner($this->baseFile, $this->targetFile);
	}
}

class MySQLBaseTestConfig extends BaseTestConfig
{
	public function __construct()
	{
		$this->_sqlmapConfigFile = SQLMAP_TESTS.'/mysql.xml';
		$this->_scriptDir = SQLMAP_TESTS.'/scripts/mysql/';
		$this->_features = array('insert_id');
		$dsn = 'mysql:host=localhost;dbname=sqlmap_test;port=3307';
		$this->_connection = new TDbConnection($dsn, 'test5', 'test5');
	}
}

class MSSQLBaseTestConfig extends BaseTestConfig
{
	public function __construct()
	{
		$this->_sqlmap = SQLMAP_TESTS.'/mssql.xml';
		$this->_connectionString = 'odbc_mssql://sqlmap_tests';
		$this->_scriptDir = SQLMAP_TESTS.'/scripts/mssql/';
		$this->_features = array('insert_id');
	}
}

class BaseTestConfig
{
	protected $_scriptDir;
	protected $_connection;
	protected $_sqlmapConfigFile;

	public function hasFeature($type)
	{
		return false;
	}

	public function getScriptDir()
	{
		return $this->_scriptDir;
	}

	public function getConnection()
	{
		return $this->_connection;
	}

	public function getSqlMapConfigFile()
	{
		return $this->_sqlmapConfigFile;
	}

	public function getScriptRunner()
	{
		return new DefaultScriptRunner();
	}

	public static function createConfigInstance()
	{
		//change this to connection to a different database

		//return new MySQLBaseTestConfig();

		return new SQLiteBaseTestConfig();

		//return new MSSQLBaseTestConfig();
	}
}


?>