<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

/**
 * Backup user interface stages
 *
 * This file contains the classes required to manage the stages that make up the
 * backup user interface.
 * These will be primarily operated a {@link base_ui} instance.
 *
 * @package   core_backup
 * @copyright 2010 Sam Hemelryk
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

/**
 * Abstract stage class
 *
 * This class should be extended by all backup stages (a requirement of many backup ui functions).
 * Each stage must then define two abstract methods
 *  - process : To process the stage
 *  - initialise_stage_form : To get a backup_moodleform instance for the stage
 *
 * @package   core_backup
 * @copyright 2010 Sam Hemelryk
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
abstract class base_ui_stage {

    /**
     * The current stage
     * @var int
     */
    protected $stage = 1;

    /**
     * The backuck UI object
     * @var base_ui
     */
    protected $ui;

    /**
     * The moodleform for this stage
     * @var base_moodleform
     */
    protected $stageform = null;

    /**
     * Custom form params that will be added as hidden inputs
     * @var array
     */
    protected $params = null;

    /**
     * Constructor
     *
     * @param base_ui $ui
     * @param array $params
     */
    public function __construct(base_ui $ui, ?array $params = null) {
        $this->ui = $ui;
        $this->params = $params;
    }

    /**
     * Returns the custom params for this stage
     * @return array|null
     */
    final public function get_params() {
        return $this->params;
    }

    /**
     * The current stage
     * @return int
     */
    final public function get_stage() {
        return $this->stage;
    }

    /**
     * The next stage
     * @return int
     */
    public function get_next_stage() {
        return floor($this->stage * 2);
    }

    /**
     * The previous stage
     * @return int
     */
    final public function get_prev_stage() {
        return floor($this->stage / 2);
    }

    /**
     * The name of this stage
     * @return string
     */
    public function get_name() {
        return get_string('currentstage' . $this->stage, 'backup');
    }

    /**
     * The backup id from the backup controller
     * @return string
     */
    final public function get_uniqueid() {
        return $this->ui->get_uniqueid();
    }

    /**
     * Displays the stage.
     *
     * By default this involves instantiating the form for the stage and the calling
     * it to display.
     *
     * @param core_backup_renderer $renderer
     * @return string HTML code to echo
     */
    public function display(core_backup_renderer $renderer) {

        $form = $this->initialise_stage_form();
        // A nasty hack follows to work around the sad fact that moodle quickforms
        // do not allow to actually return the HTML content, just to echo it.
        flush();
        ob_start();
        $form->display();
        $output = ob_get_contents();
        ob_end_clean();

        return $output;
    }

    /**
     * Processes the stage.
     *
     * This must be overridden by every stage as it will be different for every stage
     *
     * @abstract
     * @param base_moodleform $form
     */
    abstract public function process(?base_moodleform $form = null);

    /**
     * Creates an instance of the correct moodleform properly populated and all
     * dependencies instantiated
     *
     * @abstract
     * @return backup_moodleform
     */
    abstract protected function initialise_stage_form();

    /**
     * Returns the base UI class
     * @return base_ui
     */
    final public function get_ui() {
        return $this->ui;
    }

    /**
     * Returns true if this stage is the first stage.
     * @return bool
     */
    public function is_first_stage() {
        return $this->stage == 1;
    }
}
