<?php

namespace Drupal\alt_login\Plugin\AltLoginMethod;

use Drupal\alt_login\AltLoginMethodInterface;
use Drupal\user\UserInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Egulias\EmailValidator\EmailValidatorInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;

/**
 * Plugin implementation for logging in with the user name as an alias.
 *
 * @AltLoginMethod(
 *   id = "email",
 *   label = @Translation("Email"),
 *   description = @Translation("Login with the user's email")
 * )
 */
class Email extends Username implements AltLoginMethodInterface, ContainerFactoryPluginInterface {

  /**
   * @var EmailValidatorInterface
   */
  private $emailValidator;
  /**
   * @var EntityTypeManagerInterface
   */
  private $entityTypeManager;

  /**
   * @param EntityTypeManagerInterface $entity_type_manager
   * @param AltLoginMethod\EmailValidator $email_validator
   */
  function __construct(EntityTypeManagerInterface $entity_type_manager, EmailValidatorInterface $email_validator) {
    $this->entityTypeManager = $entity_type_manager;
    $this->emailValidator = $email_validator;
  }

  /**
   *
   * @param ContainerInterface $container
   * @param array $configuration
   * @param string $plugin_id
   * @param array $plugin_definition
   * @return static
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static (
      $container->get('entity_type.manager'),
      $container->get('email.validator')
    );
  }

  /**
   * {@inheritDoc}
   */
  function applies($alias) {
    return $this->emailValidator->isValid($alias);
  }


  /**
   * {@inheritDoc}
   */
  function getUsernameFromAlias($alias) {
    $users = $this->entityTypeManager->getStorage('user')->loadByProperties(['mail' => $alias]);
    if (count($users)) {
      return reset($users)->getUsername();
    }
  }

  /**
   * {@inheritDoc}
   */
  function getAlias(UserInterface $user){
    return $user->getEmail();
  }

}