/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.hadoop.gateway.filter.rewrite.impl;

import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteRuleDescriptor;
import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteStepDescriptor;
import org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriter;
import org.apache.hadoop.gateway.filter.rewrite.spi.UrlRewriteFlowDescriptorBase;
import org.apache.hadoop.gateway.util.urltemplate.Parser;
import org.apache.hadoop.gateway.util.urltemplate.Template;

import java.net.URISyntaxException;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class UrlRewriteRuleDescriptorImpl extends UrlRewriteFlowDescriptorBase<UrlRewriteRuleDescriptor> implements UrlRewriteRuleDescriptor {

  private String name;
  private String scope;
  private String pattern;
  private Template template;
  private EnumSet<UrlRewriter.Direction> directions;

  public UrlRewriteRuleDescriptorImpl() {
    super( "rule" );
  }

  @Override
  public String name() {
    return this.name;
  }

  @Override
  public UrlRewriteRuleDescriptor name( String name ) {
    this.name = name;
    return this;
  }

  public void setName( String name ) {
    name( name );
  }

  public String getName() {
    return name;
  }

  public String getScope() {
    return scope;
  }

  public void setScope(String scope) {
    scope( scope );
  }

  @Override
  public String scope() {
    return scope;
  }

  @Override
  public UrlRewriteStepDescriptor scope( String scope ) {
    this.scope = scope;
    return this;
  }

  @Override
  public EnumSet<UrlRewriter.Direction> directions() {
    return directions;
  }

  @Override
  public UrlRewriteRuleDescriptor directions( String directions ) {
    this.directions = parseDirections( directions );
    return this;
  }

  public void setDirections( String directions ) {
    directions( directions );
  }

  public void setDirection( String directions ) {
    directions( directions );
  }

  public void setDir( String directions ) {
    directions( directions );
  }

  public String getDir() {
    String s = null;
    if( directions != null ) {
      StringBuilder sb = new StringBuilder();
      for( UrlRewriter.Direction direction: directions ) {
        if( sb.length() > 0 ) {
          sb.append( ',' );
        }
        sb.append( direction.toString() );
      }
      s = sb.toString();
    }
    return s;
  }

  @Override
  public UrlRewriteRuleDescriptor directions( UrlRewriter.Direction... directions ) {
    return this;
  }

  @Override
  public String pattern() {
    return pattern;
  }

  @Override
  public UrlRewriteRuleDescriptor pattern( String pattern ) throws URISyntaxException {
    this.pattern = pattern;
    this.template = Parser.parseTemplate( pattern );
    return this;
  }

  public void setPattern( String pattern ) throws URISyntaxException {
    pattern( pattern );
  }

  public void setUrl( String pattern ) throws URISyntaxException {
    pattern( pattern );
  }

  public String getPattern() {
    return pattern();
  }

  @Override
  public Template template() {
    return template;
  }

  @Override
  public UrlRewriteRuleDescriptor template( Template template ) {
    this.template = template;
    this.pattern = template.toString();
    return this;
  }

  private static EnumSet<UrlRewriter.Direction> parseDirections( String directions ) {
    EnumSet<UrlRewriter.Direction> set = EnumSet.noneOf( UrlRewriter.Direction.class );
    StringTokenizer parser = new StringTokenizer( directions, " ,;:/|+" );
    while( parser.hasMoreTokens() ) {
      UrlRewriter.Direction direction = parseDirection( parser.nextToken() );
      if( direction != null ) {
        set.add( direction );
      }
    }
    return set;
  }

  private static UrlRewriter.Direction parseDirection( String direction ) {
    direction = direction.trim().toLowerCase();
    return directionNameMap.get( direction );
  }

  private static Map<String,UrlRewriter.Direction> directionNameMap = new HashMap<String,UrlRewriter.Direction>();
  static {
    directionNameMap.put( "inbound", UrlRewriter.Direction.IN );
    directionNameMap.put( "in", UrlRewriter.Direction.IN );
    directionNameMap.put( "i", UrlRewriter.Direction.IN );
    directionNameMap.put( "request", UrlRewriter.Direction.IN );
    directionNameMap.put( "req", UrlRewriter.Direction.IN );

    directionNameMap.put( "outbound", UrlRewriter.Direction.OUT );
    directionNameMap.put( "out", UrlRewriter.Direction.OUT );
    directionNameMap.put( "o", UrlRewriter.Direction.OUT );
    directionNameMap.put( "response", UrlRewriter.Direction.OUT );
    directionNameMap.put( "res", UrlRewriter.Direction.OUT );
  }

}
