// 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.shaking;

import com.android.tools.r8.graph.DexDefinition;
import com.android.tools.r8.graph.DexDefinitionSupplier;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;

public abstract class EnqueuerEvent {

  public DexDefinition getDefinition(DexDefinitionSupplier definitions) {
    return null;
  }

  public boolean isClassEvent() {
    return false;
  }

  public ClassEnqueuerEvent asClassEvent() {
    return null;
  }

  public boolean isLiveClassEvent() {
    return false;
  }

  public LiveClassEnqueuerEvent asLiveClassEvent() {
    return null;
  }

  public boolean isInstantiatedClassEvent() {
    return false;
  }

  public InstantiatedClassEnqueuerEvent asInstantiatedClassEvent() {
    return null;
  }

  public boolean isUnconditionalKeepInfoEvent() {
    return false;
  }

  public abstract EnqueuerEvent rewrittenWithLens(GraphLens lens);

  public abstract static class ClassEnqueuerEvent extends EnqueuerEvent {

    private final DexType clazz;

    ClassEnqueuerEvent(DexType clazz) {
      this.clazz = clazz;
    }

    @Override
    public DexDefinition getDefinition(DexDefinitionSupplier definitions) {
      return definitions.definitionFor(getType());
    }

    public DexType getType() {
      return clazz;
    }

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

    @Override
    public ClassEnqueuerEvent asClassEvent() {
      return this;
    }
  }

  public static class LiveClassEnqueuerEvent extends ClassEnqueuerEvent {

    public LiveClassEnqueuerEvent(DexProgramClass clazz) {
      this(clazz.getType());
    }

    private LiveClassEnqueuerEvent(DexType type) {
      super(type);
    }

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

    @Override
    public LiveClassEnqueuerEvent asLiveClassEvent() {
      return this;
    }

    @Override
    public EnqueuerEvent rewrittenWithLens(GraphLens lens) {
      return new LiveClassEnqueuerEvent(lens.lookupType(getType()));
    }

    @Override
    public boolean equals(Object obj) {
      if (obj == this) {
        return true;
      }
      if (obj instanceof LiveClassEnqueuerEvent) {
        LiveClassEnqueuerEvent event = (LiveClassEnqueuerEvent) obj;
        return getType() == event.getType();
      }
      return false;
    }

    @Override
    public int hashCode() {
      return (getType().hashCode() << 1) | 0;
    }
  }

  public static class InstantiatedClassEnqueuerEvent extends ClassEnqueuerEvent {

    public InstantiatedClassEnqueuerEvent(DexProgramClass clazz) {
      this(clazz.getType());
    }

    private InstantiatedClassEnqueuerEvent(DexType type) {
      super(type);
    }

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

    @Override
    public InstantiatedClassEnqueuerEvent asInstantiatedClassEvent() {
      return this;
    }

    @Override
    public EnqueuerEvent rewrittenWithLens(GraphLens lens) {
      return new InstantiatedClassEnqueuerEvent(lens.lookupType(getType()));
    }

    @Override
    public boolean equals(Object obj) {
      if (obj == this) {
        return true;
      }
      if (obj instanceof InstantiatedClassEnqueuerEvent) {
        InstantiatedClassEnqueuerEvent event = (InstantiatedClassEnqueuerEvent) obj;
        return getType() == event.getType();
      }
      return false;
    }

    @Override
    public int hashCode() {
      return (getType().hashCode() << 1) | 1;
    }
  }

  public static class UnconditionalKeepInfoEvent extends EnqueuerEvent {

    private static final UnconditionalKeepInfoEvent INSTANCE = new UnconditionalKeepInfoEvent();

    private UnconditionalKeepInfoEvent() {}

    public static UnconditionalKeepInfoEvent get() {
      return INSTANCE;
    }

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

    @Override
    public EnqueuerEvent rewrittenWithLens(GraphLens lens) {
      return this;
    }
  }
}
