import os
from data.users.externaljwt import ExternalJWTAuthN
from util.config.validators import BaseValidator, ConfigValidationException

class JWTAuthValidator(BaseValidator):
  name = "jwt"

  @classmethod
  def validate(cls, validator_context, public_key_path=None):
    """ Validates the JWT authentication system. """
    config = validator_context.config
    http_client = validator_context.http_client
    jwt_auth_max = validator_context.jwt_auth_max
    config_provider = validator_context.config_provider

    if config.get('AUTHENTICATION_TYPE', 'Database') != 'JWT':
      return

    verify_endpoint = config.get('JWT_VERIFY_ENDPOINT')
    query_endpoint = config.get('JWT_QUERY_ENDPOINT', None)
    getuser_endpoint = config.get('JWT_GETUSER_ENDPOINT', None)

    issuer = config.get('JWT_AUTH_ISSUER')

    if not verify_endpoint:
      raise ConfigValidationException('Missing JWT Verification endpoint')

    if not issuer:
      raise ConfigValidationException('Missing JWT Issuer ID')


    override_config_directory = config_provider.get_config_dir_path()

    # Try to instatiate the JWT authentication mechanism. This will raise an exception if
    # the key cannot be found.
    users = ExternalJWTAuthN(verify_endpoint, query_endpoint, getuser_endpoint, issuer,
                             override_config_directory,
                             http_client,
                             jwt_auth_max,
                             public_key_path=public_key_path,
                             requires_email=config.get('FEATURE_MAILING', True))

    # Verify that we can reach the jwt server
    (result, err_msg) = users.ping()
    if not result:
      msg = ('Verification of JWT failed: %s. \n\nWe cannot reach the JWT server' +
             'OR JWT auth is misconfigured') % err_msg
      raise ConfigValidationException(msg)