// 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.retrace.internal;

import com.android.tools.r8.references.FieldReference;
import com.android.tools.r8.references.TypeReference;
import com.android.tools.r8.retrace.RetracedFieldReference;
import java.util.Objects;

public abstract class RetracedFieldReferenceImpl implements RetracedFieldReference {

  private RetracedFieldReferenceImpl() {}

  @Override
  public boolean isUnknown() {
    return true;
  }

  @Override
  public final boolean isKnown() {
    return !isUnknown();
  }

  @Override
  public KnownRetracedFieldReferenceImpl asKnown() {
    return null;
  }

  public static final class KnownRetracedFieldReferenceImpl extends RetracedFieldReferenceImpl
      implements KnownRetracedFieldReference {

    private final FieldReference fieldReference;

    private KnownRetracedFieldReferenceImpl(FieldReference fieldReference) {
      this.fieldReference = fieldReference;
    }

    @Override
    public boolean isUnknown() {
      return false;
    }

    @Override
    public KnownRetracedFieldReferenceImpl asKnown() {
      return this;
    }

    @Override
    public RetracedClassReferenceImpl getHolderClass() {
      return RetracedClassReferenceImpl.create(fieldReference.getHolderClass());
    }

    @Override
    public String getFieldName() {
      return fieldReference.getFieldName();
    }

    @Override
    public TypeReference getFieldType() {
      return fieldReference.getFieldType();
    }

    @Override
    public FieldReference getFieldReference() {
      return fieldReference;
    }

    @Override
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }
      KnownRetracedFieldReferenceImpl that = (KnownRetracedFieldReferenceImpl) o;
      return fieldReference.equals(that.fieldReference);
    }

    @Override
    public int hashCode() {
      return Objects.hash(fieldReference);
    }
  }

  public static final class UnknownRetracedFieldReferenceImpl extends RetracedFieldReferenceImpl {

    private final FieldDefinition fieldDefinition;

    private UnknownRetracedFieldReferenceImpl(FieldDefinition fieldDefinition) {
      this.fieldDefinition = fieldDefinition;
    }

    @Override
    public RetracedClassReferenceImpl getHolderClass() {
      return RetracedClassReferenceImpl.create(fieldDefinition.getHolderClass());
    }

    @Override
    public String getFieldName() {
      return fieldDefinition.getName();
    }

    @Override
    public boolean equals(Object o) {
      if (this == o) {
        return true;
      }
      if (o == null || getClass() != o.getClass()) {
        return false;
      }
      UnknownRetracedFieldReferenceImpl that = (UnknownRetracedFieldReferenceImpl) o;
      return fieldDefinition.equals(that.fieldDefinition);
    }

    @Override
    public int hashCode() {
      return Objects.hash(fieldDefinition);
    }
  }

  static RetracedFieldReferenceImpl create(FieldReference fieldReference) {
    return new KnownRetracedFieldReferenceImpl(fieldReference);
  }

  static RetracedFieldReferenceImpl create(FieldDefinition fieldDefinition) {
    return new UnknownRetracedFieldReferenceImpl(fieldDefinition);
  }
}
