<?php

declare(strict_types=1);

namespace Drupal\flowdrop_session\Form;

use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
use Drupal\flowdrop_session\Constants\SessionStatus;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Filter form for the session admin list.
 *
 * @internal
 */
class SessionFilterForm extends FormBase {

  public function __construct(
    private readonly EntityTypeManagerInterface $entityTypeManager,
  ) {}

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container): static {
    return new static($container->get('entity_type.manager'));
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId(): string {
    return 'flowdrop_session_filter_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state): array {
    $request = $this->getRequest();

    $form['#method'] = 'get';
    $form['#action'] = Url::fromRoute('entity.flowdrop_session.collection')->toString();
    $form['#attributes']['class'][] = 'views-exposed-form';

    $form['filters'] = [
      '#type' => 'container',
      '#attributes' => ['class' => ['form--inline', 'clearfix']],
    ];

    $workflows = $this->entityTypeManager
      ->getStorage('flowdrop_workflow')
      ->loadByProperties(['status' => TRUE]);
    $workflowOptions = ['' => $this->t('- Any workflow -')];
    foreach ($workflows as $workflow) {
      $workflowOptions[$workflow->id()] = $workflow->label();
    }

    $form['filters']['workflow'] = [
      '#type' => 'select',
      '#title' => $this->t('Workflow'),
      '#options' => $workflowOptions,
      '#default_value' => $request->query->get('workflow', ''),
    ];

    $form['filters']['status'] = [
      '#type' => 'select',
      '#title' => $this->t('Status'),
      '#options' => ['' => $this->t('- Any status -')] + SessionStatus::allowedValues(),
      '#default_value' => $request->query->get('status', ''),
    ];

    $form['filters']['date_from'] = [
      '#type' => 'date',
      '#title' => $this->t('Created from'),
      '#default_value' => $request->query->get('date_from', ''),
    ];

    $form['filters']['date_to'] = [
      '#type' => 'date',
      '#title' => $this->t('Created to'),
      '#default_value' => $request->query->get('date_to', ''),
    ];

    $form['filters']['actions'] = [
      '#type' => 'actions',
    ];

    $form['filters']['actions']['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Filter'),
    ];

    $form['filters']['actions']['reset'] = [
      '#type' => 'link',
      '#title' => $this->t('Reset'),
      '#url' => Url::fromRoute('entity.flowdrop_session.collection'),
      '#attributes' => ['class' => ['button']],
    ];

    $form['form_build_id']['#access'] = FALSE;
    $form['form_token']['#access'] = FALSE;
    $form['form_id']['#access'] = FALSE;

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state): void {}

}
