// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.android.tools.r8.kotlin;

import com.google.common.collect.ImmutableList;
import java.util.List;
import kotlinx.metadata.KmVersion;
import kotlinx.metadata.KmVersionRequirement;
import kotlinx.metadata.KmVersionRequirementLevel;
import kotlinx.metadata.KmVersionRequirementVersionKind;
import kotlinx.metadata.KmVersionRequirementVisitor;

class KotlinVersionRequirementInfo {

  private static final KotlinVersionRequirementInfo NO_VERSION_REQUIREMENTS =
      new KotlinVersionRequirementInfo(ImmutableList.of());

  private final List<KotlinVersionRequirementPoint> versionRequirements;

  private KotlinVersionRequirementInfo(List<KotlinVersionRequirementPoint> versionRequirements) {
    this.versionRequirements = versionRequirements;
  }

  static KotlinVersionRequirementInfo create(List<KmVersionRequirement> kmVersionRequirements) {
    if (kmVersionRequirements.isEmpty()) {
      return NO_VERSION_REQUIREMENTS;
    }
    ImmutableList.Builder<KotlinVersionRequirementPoint> builder = ImmutableList.builder();
    for (KmVersionRequirement kmVersionRequirement : kmVersionRequirements) {
      builder.add(KotlinVersionRequirementPoint.create(kmVersionRequirement));
    }
    return new KotlinVersionRequirementInfo(builder.build());
  }

  boolean rewrite(KmVisitorProviders.KmVersionRequirementVisitorProvider visitorProvider) {
    if (this == NO_VERSION_REQUIREMENTS) {
      return false;
    }
    for (KotlinVersionRequirementPoint versionRequirement : versionRequirements) {
      versionRequirement.rewrite(visitorProvider.get());
    }
    return false;
  }

  private static class KotlinVersionRequirementPoint {

    private final Integer errorCode;
    private final KmVersionRequirementVersionKind kind;
    private final KmVersionRequirementLevel level;
    private final String message;
    private final KmVersion version;

    private KotlinVersionRequirementPoint(
        KmVersionRequirementVersionKind kind,
        KmVersionRequirementLevel level,
        Integer errorCode,
        String message,
        KmVersion version) {
      this.errorCode = errorCode;
      this.kind = kind;
      this.level = level;
      this.message = message;
      this.version = version;
    }

    private static KotlinVersionRequirementPoint create(KmVersionRequirement kmVersionRequirement) {
      return new KotlinVersionRequirementPoint(
          kmVersionRequirement.kind,
          kmVersionRequirement.level,
          kmVersionRequirement.getErrorCode(),
          kmVersionRequirement.getMessage(),
          kmVersionRequirement.version);
    }

    private void rewrite(KmVersionRequirementVisitor visitor) {
      visitor.visit(kind, level, errorCode, message);
      visitor.visitVersion(version.getMajor(), version.getMinor(), version.getPatch());
      visitor.visitEnd();
    }
  }
}
