/*
 * Copyright 2014-present Facebook, Inc.
 *
 * 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.facebook.buck.rules.coercer;

import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.parser.BuildTargetParser;
import com.facebook.buck.util.HumanReadableException;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.collect.FluentIterable;

import java.nio.file.Path;
import java.util.List;

/**
 * {@link TypeCoercer} that takes a list of strings and transforms it into a
 * {@link BuildConfigFields}. This class takes care of parsing each string, making sure it conforms
 * to the specification in {@link BuildConfigFields}.
 */
public class BuildConfigFieldsTypeCoercer extends LeafTypeCoercer<BuildConfigFields> {

  @Override
  public Class<BuildConfigFields> getOutputClass() {
    return BuildConfigFields.class;
  }

  @Override
  public BuildConfigFields coerce(
      BuildTargetParser buildTargetParser,
      ProjectFilesystem filesystem,
      Path pathRelativeToProjectRoot,
      Object object) throws CoerceFailedException {
    if (!(object instanceof List)) {
      throw CoerceFailedException.simple(object, getOutputClass());
    }

    List<?> list = (List<?>) object;
    List<String> values = FluentIterable.from(list).transform(new Function<Object, String> () {
      @Override
      public String apply(Object input) {
        if (input instanceof String) {
          return (String) input;
        } else {
          throw new HumanReadableException(
              "Expected string for build config values but was: %s",
              input);
        }
      }
    }).toList();
    return BuildConfigFields.fromFieldDeclarations(values);
  }

  @Override
  public Optional<BuildConfigFields> getOptionalValue() {
    return Optional.of(BuildConfigFields.empty());
  }
}
