/*
 * 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.sdk.BlazeSdkProvider;
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 = BlazeSdkProvider.getInstance().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(BlazeSdkProvider.getInstance().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();
    }
  }
}
