<?php

namespace Icinga\Module\Director\Db;

use Exception;
use Icinga\Exception\IcingaException;
use Icinga\Module\Director\Db;

class Migration
{
    /**
     * @var string
     */
    protected $sql;

    /**
     * @var int
     */
    protected $version;

    public function __construct($version, $sql)
    {
        $this->version = $version;
        $this->sql     = $sql;
    }

    public function apply(Db $connection)
    {
        $db = $connection->getDbAdapter();
        $queries = preg_split('/[\n\s\t]*\;[\n\s\t]*/s', $this->sql, -1, PREG_SPLIT_NO_EMPTY);

        if (empty($queries)) {
            throw new IcingaException(
                'Migration %d has no queries',
                $this->version
            );
        }

        try {
            $db->beginTransaction();

            foreach ($queries as $query) {
                $db->exec($query);
            }

            $db->commit();

        } catch (Exception $e) {

            $db->rollback();
            throw new IcingaException(
                'Migration %d failed: %s',
                $this->version,
                $e->getMessage()
            );
        }

        return $this;
    }
}