/*
 * Copyright 2016 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.idea.blaze.android.projectview;

import static java.util.stream.Collectors.toList;

import com.google.common.collect.ImmutableList;
import com.google.idea.blaze.android.compatibility.Compatibility.AndroidSdkUtils;
import com.google.idea.blaze.android.sync.sdk.AndroidSdkFromProjectView;
import com.google.idea.blaze.base.projectview.ProjectView;
import com.google.idea.blaze.base.projectview.parser.ParseContext;
import com.google.idea.blaze.base.projectview.parser.ProjectViewParser;
import com.google.idea.blaze.base.projectview.section.ScalarSection;
import com.google.idea.blaze.base.projectview.section.ScalarSectionParser;
import com.google.idea.blaze.base.projectview.section.SectionKey;
import com.google.idea.blaze.base.projectview.section.SectionParser;
import com.google.idea.blaze.base.projectview.section.sections.TextBlock;
import com.google.idea.blaze.base.projectview.section.sections.TextBlockSection;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.text.StringUtil;
import java.util.List;
import org.jetbrains.annotations.Nullable;

/** Allows manual override of the android sdk. */
public class AndroidSdkPlatformSection {
  public static final SectionKey<String, ScalarSection<String>> KEY =
      SectionKey.of("android_sdk_platform");
  public static final SectionParser PARSER = new AndroidSdkPlatformParser();

  private static class AndroidSdkPlatformParser extends ScalarSectionParser<String> {
    public AndroidSdkPlatformParser() {
      super(KEY, ':');
    }

    @Nullable
    @Override
    protected String parseItem(ProjectViewParser parser, ParseContext parseContext, String rest) {
      return StringUtil.unquoteString(rest);
    }

    @Override
    protected void printItem(StringBuilder sb, String value) {
      sb.append(value);
    }

    @Override
    public ItemType getItemType() {
      return ItemType.Other;
    }

    @Override
    public ProjectView addProjectViewDefaultValue(ProjectView projectView) {
      if (!projectView.getSectionsOfType(KEY).isEmpty()) {
        return projectView;
      }
      List<Sdk> sdks = AndroidSdkUtils.getAllAndroidSdks();
      ProjectView.Builder builder =
          ProjectView.builder(projectView).add(TextBlockSection.of(TextBlock.newLine()));

      if (sdks.isEmpty()) {
        builder
            .add(TextBlockSection.of(TextBlock.of("# Please set to an android SDK platform")))
            .add(
                TextBlockSection.of(
                    TextBlock.of(
                        "# You currently have no SDKs. Please use the SDK manager first.")))
            .add(ScalarSection.builder(KEY).set("(android sdk goes here)"));
      } else if (sdks.size() == 1) {
        builder.add(
            ScalarSection.builder(KEY)
                .set(AndroidSdkFromProjectView.getSdkTargetHash(sdks.get(0))));
      } else {
        builder.add(
            TextBlockSection.of(
                TextBlock.of("# Please uncomment an android-SDK platform. Available SDKs are:")));
        List<String> sdkOptions =
            AndroidSdkFromProjectView.getAvailableSdkTargetHashes(sdks)
                .stream()
                .map(androidSdk -> "# android_sdk_platform: " + androidSdk)
                .collect(toList());
        builder.add(TextBlockSection.of(new TextBlock(ImmutableList.copyOf(sdkOptions))));
      }
      return builder.build();
    }
  }
}
