<?php

namespace Drupal\workflow_type_test\Plugin\WorkflowType;

use Drupal\workflows\Plugin\WorkflowTypeBase;
use Drupal\workflows\State;

/**
 * Test workflow type.
 *
 * @WorkflowType(
 *   id = "predefined_states_workflow_test_type",
 *   label = @Translation("Predefined States Workflow Test Type"),
 *   required_states = {
 *     "pay_blinds",
 *     "bet",
 *     "raise",
 *     "fold",
 *   }
 * )
 */
class PredefinedStatesWorkflowTestType extends WorkflowTypeBase {

  /**
   * {@inheritdoc}
   */
  public function getStates($state_ids = NULL) {
    return array_filter([
      'pay_blinds' => new State($this, 'pay_blinds', 'Pay Blinds'),
      'bet' => new State($this, 'bet', 'Bet'),
      'raise' => new State($this, 'raise', 'Raise'),
      'fold' => new State($this, 'fold', 'Fold'),
    ], function ($state) use ($state_ids) {
        return is_array($state_ids) ? in_array($state->id(), $state_ids) : TRUE;
    });
  }

  /**
   * {@inheritdoc}
   */
  public function getState($state_id) {
    $states = $this->getStates();
    if (!isset($states[$state_id])) {
      throw new \InvalidArgumentException("The state '$state_id' does not exist in workflow.'");
    }
    return $states[$state_id];
  }

  /**
   * {@inheritdoc}
   */
  public function hasState($state_id) {
    $states = $this->getStates();
    return isset($states[$state_id]);
  }

  /**
   * {@inheritdoc}
   */
  public function addState($state_id, $label) {
    // States cannot be added on this workflow.
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function setStateLabel($state_id, $label) {
    // States cannot be altered on this workflow.
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function setStateWeight($state_id, $weight) {
    // States cannot be altered on this workflow.
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function deleteState($state_id) {
    // States cannot be deleted on this workflow.
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    return [
      'transitions' => [],
    ];
  }

}
