// Copyright (c) 2018, 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.utils.codeinspector;

import com.android.tools.r8.graph.DexAnnotationElement;
import com.android.tools.r8.graph.DexValue;
import com.android.tools.r8.graph.DexValue.DexValueString;
import com.android.tools.r8.naming.MemberNaming.Signature;

public abstract class MemberSubject extends Subject {

  public abstract boolean isPublic();

  public abstract boolean isProtected();

  public abstract boolean isPrivate();

  public abstract boolean isPackagePrivate();

  public abstract boolean isStatic();

  public abstract boolean isFinal();

  public abstract Signature getOriginalSignature();

  public abstract Signature getFinalSignature();

  public String getOriginalName() {
    return getOriginalName(true);
  }

  public String getOriginalName(boolean qualified) {
    Signature originalSignature = getOriginalSignature();
    if (originalSignature != null) {
      String name = originalSignature.name;
      if (!qualified) {
        int index = name.lastIndexOf(".");
        if (index >= 0) {
          return name.substring(index + 1);
        }
      }
      return name;
    }
    return null;
  }

  public String getFinalName() {
    Signature finalSignature = getFinalSignature();
    return finalSignature == null ? null : finalSignature.name;
  }

  public abstract AnnotationSubject annotation(String name);

  public AnnotationSubject getSignatureAnnotation() {
    return annotation("dalvik.annotation.Signature");
  }

  public String getSignatureAnnotationValue() {
    AnnotationSubject annotation = getSignatureAnnotation();
    if (!annotation.isPresent()) {
      return null;
    }

    assert annotation.getAnnotation().elements.length == 1;
    DexAnnotationElement element = annotation.getAnnotation().elements[0];
    assert element.name.toString().equals("value");
    assert element.value instanceof DexValue.DexValueArray;
    DexValue.DexValueArray array = (DexValue.DexValueArray) element.value;
    StringBuilder builder = new StringBuilder();
    for (DexValue value : array.getValues()) {
      if (value instanceof DexValueString) {
        builder.append(((DexValueString) value).value);
      } else {
        builder.append(value.toString());
      }
    }
    return builder.toString();
  }

  public FieldSubject asFieldSubject() {
    return null;
  }

  public boolean isFieldSubject() {
    return false;
  }

  public MethodSubject asMethodSubject() {
    return null;
  }

  public boolean isMethodSubject() {
    return false;
  }
}
