// Copyright (c) 2021, 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.androidapi;

import static com.android.tools.r8.utils.AndroidApiLevel.getAndroidApiLevel;

import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.references.TypeReference;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.TraversalContinuation;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;

/** This is a base class for all generated classes from api-versions.xml. */
public abstract class AndroidApiClass {

  private final ClassReference classReference;

  public AndroidApiClass(ClassReference classReference) {
    this.classReference = classReference;
  }

  public abstract AndroidApiLevel getApiLevel();

  public abstract int getMemberCount();

  public TraversalContinuation<?, ?> visitFields(
      BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor) {
    return visitFields(visitor, classReference, 1);
  }

  public TraversalContinuation<?, ?> visitMethods(
      BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor) {
    return visitMethods(visitor, classReference, 1);
  }

  protected abstract TraversalContinuation<?, ?> visitFields(
      BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor,
      ClassReference holder,
      int minApiClass);

  protected abstract TraversalContinuation<?, ?> visitMethods(
      BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor,
      ClassReference holder,
      int minApiClass);

  protected TraversalContinuation<?, ?> visitField(
      BiFunction<FieldReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor,
      ClassReference holder,
      int minApiClass,
      int minApiField,
      String name,
      String typeDescriptor) {
    return visitor.apply(
        Reference.field(holder, name, Reference.typeFromDescriptor(typeDescriptor)),
        getAndroidApiLevel(Integer.max(minApiClass, minApiField)));
  }

  protected TraversalContinuation<?, ?> visitMethod(
      BiFunction<MethodReference, AndroidApiLevel, TraversalContinuation<?, ?>> visitor,
      ClassReference holder,
      int minApiClass,
      int minApiMethod,
      String name,
      String[] formalTypeDescriptors,
      String returnType) {
    List<TypeReference> typeReferenceList = new ArrayList<>(formalTypeDescriptors.length);
    for (String formalTypeDescriptor : formalTypeDescriptors) {
      typeReferenceList.add(Reference.typeFromDescriptor(formalTypeDescriptor));
    }
    return visitor.apply(
        Reference.method(
            holder,
            name,
            typeReferenceList,
            returnType == null ? null : Reference.returnTypeFromDescriptor(returnType)),
        getAndroidApiLevel(Integer.max(minApiClass, minApiMethod)));
  }
}
