/*
 * 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.drill.exec.compile.sig;

import org.apache.drill.exec.expr.ClassGenerator.BlockType;

import com.google.common.base.Preconditions;

/**
 * The code generator works with four conceptual methods which can
 * have any actual names. This class identify which conceptual methods
 * are in use and their actual names. Callers obtain the method
 * names generically using the {@link BlockType} enum. There is,
 * however, no way to check which methods are in use; the user of
 * this method must already know this information from another
 * source.
 * <table>
 * <tr><th>Conceptual Method</th>
 *     <th>BlockType</th>
 *     <th>Typical Drill Name</th></tr>
 * <tr><td>setup</td><td>SETUP</td><td>doSetup</td></tr>
 * <tr><td>eval</td><td>EVAL</td><td>doEval</td></tr>
 * <tr><td>reset</td><td>RESET</td><td>?</td></tr>
 * <tr><td>cleanup</td><td>CLEANUP</td><td>?</td></tr>
 * </table>
 */

public class GeneratorMapping {
  static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(GeneratorMapping.class);

  private final String setup;
  private final String eval;
  private final String reset;
  private final String cleanup;

  public GeneratorMapping(final String setup, final String eval, final String reset, final String cleanup) {
    super();
    this.setup = setup;
    this.eval = eval;
    this.reset = reset;
    this.cleanup = cleanup;
  }

  public GeneratorMapping(final GeneratorMapping gm) {
    super();
    this.setup = gm.setup;
    this.eval = gm.eval;
    this.reset = gm.reset;
    this.cleanup = gm.cleanup;
  }

  public static GeneratorMapping GM(final String setup, final String eval) {
    return create(setup, eval, null, null);
  }

  public static GeneratorMapping GM(
      final String setup, final String eval, final String reset, final String cleanup) {
    return create(setup, eval, reset, cleanup);
  }

  public static GeneratorMapping create(
      final String setup, final String eval, final String reset, final String cleanup) {
    return new GeneratorMapping(setup, eval, reset, cleanup);
  }

  public String getMethodName(final BlockType type) {
    switch(type) {
    case CLEANUP:
      Preconditions.checkNotNull(cleanup, "The current mapping does not have a cleanup method defined.");
      return cleanup;
    case EVAL:
      Preconditions.checkNotNull(eval, "The current mapping does not have an eval method defined.");
      return eval;
    case RESET:
      Preconditions.checkNotNull(reset, "The current mapping does not have a reset method defined.");
      return reset;
    case SETUP:
      Preconditions.checkNotNull(setup, "The current mapping does not have a setup method defined.");
      return setup;
    default:
      throw new IllegalStateException();
    }
  }
}
