// Copyright 2014 The Bazel Authors. All rights reserved.
//
// Licensed 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 com.google.devtools.build.lib.analysis.config;

import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.config.CoreOptionConverters.LabelConverter;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.shell.ShellUtils;
import com.google.devtools.build.lib.shell.ShellUtils.TokenizationException;
import com.google.devtools.common.options.Converter;
import com.google.devtools.common.options.OptionsParsingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.annotation.Nullable;

/** --run_under options converter. */
public class RunUnderConverter implements Converter<RunUnder> {
  private static final LabelConverter LABEL_CONVERTER = new LabelConverter();

  @Override
  public RunUnder convert(final String input, Object conversionContext)
      throws OptionsParsingException {
    final List<String> runUnderList = new ArrayList<>();
    try {
      ShellUtils.tokenize(runUnderList, input);
    } catch (TokenizationException e) {
      throw new OptionsParsingException("Not a valid command prefix " + e.getMessage());
    }
    if (runUnderList.isEmpty()) {
      throw new OptionsParsingException("Empty command");
    }
    final String runUnderCommand = runUnderList.get(0);
    ImmutableList<String> runUnderSuffix =
        ImmutableList.copyOf(runUnderList.subList(1, runUnderList.size()));
    if (runUnderCommand.startsWith("//") || runUnderCommand.startsWith("@")) {
      try {
        final Label runUnderLabel = LABEL_CONVERTER.convert(runUnderCommand, conversionContext);
        return new RunUnderLabel(input, runUnderLabel, runUnderSuffix);
      } catch (OptionsParsingException e) {
        throw new OptionsParsingException("Not a valid label " + e.getMessage());
      }
    } else {
      return new RunUnderCommand(input, runUnderCommand, runUnderSuffix);
    }
  }

  private static final class RunUnderLabel implements RunUnder {
    private final String input;
    private final Label runUnderLabel;
    private final ImmutableList<String> runUnderList;

    RunUnderLabel(String input, Label runUnderLabel, ImmutableList<String> runUnderList) {
      this.input = input;
      this.runUnderLabel = runUnderLabel;
      this.runUnderList = runUnderList;
    }

    @Override
    public String getValue() {
      return input;
    }

    @Override
    public Label getLabel() {
      return runUnderLabel;
    }

    @Override
    @Nullable
    public String getCommand() {
      return null;
    }

    @Override
    public ImmutableList<String> getOptions() {
      return runUnderList;
    }

    @Override
    public String toString() {
      return input;
    }

    @Override
    public boolean equals(Object other) {
      if (this == other) {
        return true;
      } else if (other instanceof RunUnderLabel) {
        RunUnderLabel otherRunUnderLabel = (RunUnderLabel) other;
        return Objects.equals(input, otherRunUnderLabel.input)
            && Objects.equals(runUnderLabel, otherRunUnderLabel.runUnderLabel)
            && Objects.equals(runUnderList, otherRunUnderLabel.runUnderList);
      } else {
        return false;
      }
    }

    @Override
    public int hashCode() {
      return Objects.hash(input, runUnderLabel, runUnderList);
    }
  }

  private static final class RunUnderCommand implements RunUnder {
    private final String input;
    private final String runUnderCommand;
    private final ImmutableList<String> runUnderList;

    RunUnderCommand(String input, String runUnderCommand, ImmutableList<String> runUnderList) {
      this.input = input;
      this.runUnderCommand = runUnderCommand;
      this.runUnderList = runUnderList;
    }

    @Override
    public String getValue() {
      return input;
    }

    @Override
    @Nullable
    public Label getLabel() {
      return null;
    }

    @Override
    public String getCommand() {
      return runUnderCommand;
    }

    @Override
    public ImmutableList<String> getOptions() {
      return runUnderList;
    }

    @Override
    public String toString() {
      return input;
    }

    @Override
    public boolean equals(Object other) {
      if (this == other) {
        return true;
      } else if (other instanceof RunUnderCommand) {
        RunUnderCommand otherRunUnderCommand = (RunUnderCommand) other;
        return Objects.equals(input, otherRunUnderCommand.input)
            && Objects.equals(runUnderCommand, otherRunUnderCommand.runUnderCommand)
            && Objects.equals(runUnderList, otherRunUnderCommand.runUnderList);
      } else {
        return false;
      }
    }

    @Override
    public int hashCode() {
      return Objects.hash(input, runUnderCommand, runUnderList);
    }
  }
  @Override
  public String getTypeDescription() {
    return "a prefix in front of command";
  }
}
