<?php

namespace PluginsNameSpaces\Database;

use PluginsNameSpaces\Database\Migrations\ExampleMigrator;
use PluginsNameSpaces\Database\Migrations\ExampleItemMigrator;

/**
 * Runs all registered migrations and tracks the schema version.
 *
 * Add new migration classes to the $migrations array. On activation
 * (and on upgrade, via maybeMigrate) every migration's up() is run —
 * dbDelta makes this safe to repeat.
 */
class DBMigrator
{
    /**
     * Ordered list of migration classes.
     *
     * @var array
     */
    protected static $migrations = [
        ExampleMigrator::class,
        ExampleItemMigrator::class,
    ];

    /**
     * Run all migrations.
     *
     * @return void
     */
    public static function migrate()
    {
        foreach (static::$migrations as $migration) {
            $migration::up();
        }
    }

    /**
     * Run migrations only when the stored DB version is behind the
     * code's DB version. Called on every `init`.
     *
     * @return void
     */
    public static function maybeMigrate()
    {
        $installed = get_option('__SNAKE_NAME___db_version');

        if ($installed === __CONST_PREFIX___DB_VERSION) {
            return;
        }

        static::migrate();

        update_option('__SNAKE_NAME___db_version', __CONST_PREFIX___DB_VERSION);
    }

    /**
     * Roll back all migrations (drops tables).
     *
     * @return void
     */
    public static function rollback()
    {
        foreach (array_reverse(static::$migrations) as $migration) {
            $migration::down();
        }
    }
}
