<?php
/**
 * DB Migrate script
 *
 * Export source database as SQL file
 * Backup destination database as SQL file
 * Import source export into destination database
 * Replace values in destination database
 *
 * DB Migrate: Makes DTAP for Wordpress projects easy!
 */

// get the project root directory
$base_dir = realpath(__DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..');

// get the config file
$config_file = $base_dir . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'dbmigrate' . DIRECTORY_SEPARATOR . 'env.ini';
if (file_exists($config_file) === false)
    exit('Config file does not exists. ' . $config_file);
$config = parse_ini_file($config_file, true);
$envs = array();
foreach ($config as $name => $section)
{
    if (substr($name, 0, strlen('env_')) === 'env_')
        $envs[substr($name, strlen('env_'))] = $section;
}

// check if config is valid
if (count($envs) < 2)
    exit('Define at leaste 2 environments in the config!');

// list envs
echo 'Available environments: ' . PHP_EOL;
foreach ($envs as $name => $env_config)
    echo '* ' . $name . PHP_EOL;
echo PHP_EOL;

// ask source env
echo 'Select the source env: ';
$source = trim(fgets(STDIN));
echo PHP_EOL;

// ask dest env
echo 'Select the destination env: ';
$dest = trim(fgets(STDIN));
echo PHP_EOL;

// ask confirmation
echo 'Please make sure:' . PHP_EOL . 'You want to export the ' . $source . ' database to the ' . $dest . ' database, all data in ' . $dest . ' will be removed! [Y|N]? ';
$confirm = strtolower(trim(fgets(STDIN)));
echo PHP_EOL;
if (in_array($confirm, array('y', 'yes', 'j', 'ja', 'ok')) === false)
    exit('Okay, exit!');

// create backup directory
if (file_exists($base_dir . DIRECTORY_SEPARATOR . 'backup') === false)
{
    echo 'Creating backup directory ' . $base_dir . DIRECTORY_SEPARATOR . 'backup';
    mkdir($base_dir . DIRECTORY_SEPARATOR . 'backup');
}

// dump source and save path
echo 'Dump source database:' . PHP_EOL;
$source_dump = $file = $base_dir . DIRECTORY_SEPARATOR . 'backup' . DIRECTORY_SEPARATOR . 'dbbackup_' . $source . '_' . date('YmdHis') . '.sql';
$command = 'mysqldump --add-drop-table --comments --host=' . $envs[$source]['host'] . ' --no-create-db --password=' . $envs[$source]['password'] . ' --port=' . $envs[$source]['port'] . ' --result-file=' . $file . ' --default-character-set=utf8 --user=' . $envs[$source]['user'] . ' ' . $envs[$source]['name'];
echo '  target file: ' . $file . PHP_EOL;
echo '  command: ' . $command . PHP_EOL;
system($command);
echo PHP_EOL . 'Complete' . PHP_EOL . PHP_EOL;

// dump dest and save path
echo 'Dump source database:' . PHP_EOL;
$dest_dump = $file = $base_dir . DIRECTORY_SEPARATOR . 'backup' . DIRECTORY_SEPARATOR . 'dbbackup_' . $dest . '_' . date('YmdHis') . '.sql';
$command = 'mysqldump --add-drop-table --comments --host=' . $envs[$dest]['host'] . ' --no-create-db --password=' . $envs[$dest]['password'] . ' --port=' . $envs[$dest]['port'] . ' --result-file=' . $file . ' --default-character-set=utf8 --user=' . $envs[$dest]['user'] . ' ' . $envs[$dest]['name'];
echo '  target file: ' . $file . PHP_EOL;
echo '  command: ' . $command . PHP_EOL;
system($command);
echo PHP_EOL . 'Complete' . PHP_EOL . PHP_EOL;

// load data
echo 'Load data on destination database:' . PHP_EOL;
$command = 'mysql --host=' . $envs[$dest]['host'] . ' --password=' . $envs[$dest]['password'] . ' --port=' . $envs[$dest]['port'] . ' --default-character-set=utf8 --user=' . $envs[$dest]['user'] . ' --database=' . $envs[$dest]['name'] . ' < ' . $source_dump;
echo '  load sql: ' . $source_dump . PHP_EOL;
echo '  command: ' . $command . PHP_EOL;
system($command);
echo PHP_EOL . 'Complete' . PHP_EOL . PHP_EOL;

// run dvdgiessen dbsr
echo 'Replace domain information in database:' . PHP_EOL;
$command = 'php vendor\dvdgiessen\dbsr\index.php --host ' . $envs[$dest]['host'] . ' --user ' . $envs[$dest]['user'] . ' --password ' . $envs[$dest]['password'] . ' --database ' . $envs[$dest]['name'] . ' --charset utf8 -- ' . $envs[$source]['domain'] . ' ' . $envs[$dest]['domain'];
echo '  search for:   ' . $envs[$source]['domain'] . PHP_EOL;
echo '  replace with: ' . $envs[$dest]['domain'] . PHP_EOL;
echo '  command: ' . $command . PHP_EOL;
system($command);
echo PHP_EOL . 'Complete' . PHP_EOL . PHP_EOL;

// info user
echo 'A copy of the old database of ' .  $dest . ' is saved in ' . $dest_dump . PHP_EOL;
echo PHP_EOL . 'Done!' . PHP_EOL . PHP_EOL;