// Copyright (c) 2023, 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.profile.art.utils;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;

import com.android.tools.r8.profile.art.model.ExternalArtProfile;
import com.android.tools.r8.profile.art.model.ExternalArtProfileClassRule;
import com.android.tools.r8.profile.art.model.ExternalArtProfileMethodRule;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.MethodSubject;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;

public class ArtProfileInspector {

  private final ExternalArtProfile artProfile;

  private final Set<ClassReference> checkedClassReferences = new HashSet<>();
  private final Set<MethodReference> checkedMethodReferences = new HashSet<>();

  public ArtProfileInspector(ExternalArtProfile artProfile) {
    this.artProfile = artProfile;
  }

  public ArtProfileInspector applyIf(boolean condition, Consumer<ArtProfileInspector> fn) {
    if (condition) {
      fn.accept(this);
    }
    return this;
  }

  public ArtProfileInspector assertEmpty() {
    assertEquals(0, artProfile.size());
    return this;
  }

  public ArtProfileInspector assertNotEmpty() {
    assertNotEquals(0, artProfile.size());
    return this;
  }

  public ArtProfileInspector assertContainsClassRule(ClassReference classReference) {
    assertThat(artProfile, ArtProfileMatchers.containsClassRule(classReference));
    checkedClassReferences.add(classReference);
    return this;
  }

  public ArtProfileInspector assertContainsClassRules(ClassReference... classReferences) {
    for (ClassReference classReference : classReferences) {
      assertContainsClassRule(classReference);
    }
    return this;
  }

  public ArtProfileInspector assertContainsClassRule(ClassSubject classSubject) {
    return assertContainsClassRule(classSubject.getFinalReference());
  }

  public ArtProfileInspector assertContainsClassRules(ClassSubject... classSubjects) {
    for (ClassSubject classSubject : classSubjects) {
      assertContainsClassRule(classSubject);
    }
    return this;
  }

  public ArtProfileInspector assertContainsMethodRule(MethodReference methodReference) {
    assertThat(artProfile, ArtProfileMatchers.containsMethodRule(methodReference));
    checkedMethodReferences.add(methodReference);
    return this;
  }

  public ArtProfileInspector assertContainsMethodRules(MethodReference... methodReferences) {
    for (MethodReference methodReference : methodReferences) {
      assertContainsMethodRule(methodReference);
    }
    return this;
  }

  public ArtProfileInspector assertContainsMethodRule(MethodSubject methodSubject) {
    return assertContainsMethodRule(methodSubject.getFinalReference());
  }

  public ArtProfileInspector assertContainsMethodRules(MethodSubject... methodSubjects) {
    for (MethodSubject methodSubject : methodSubjects) {
      assertContainsMethodRule(methodSubject);
    }
    return this;
  }

  public ArtProfileInspector assertContainsNoOtherRules() {
    assertEquals(checkedClassReferences.size() + checkedMethodReferences.size(), artProfile.size());
    return this;
  }

  public ArtProfileInspector inspectClassRule(
      ClassReference classReference, Consumer<ArtProfileClassRuleInspector> inspector) {
    assertContainsClassRule(classReference);
    ExternalArtProfileClassRule classRule = artProfile.getClassRule(classReference);
    inspector.accept(new ArtProfileClassRuleInspector(classRule));
    return this;
  }

  public ArtProfileInspector inspectMethodRule(
      MethodReference methodReference, Consumer<ArtProfileMethodRuleInspector> inspector) {
    assertContainsMethodRule(methodReference);
    ExternalArtProfileMethodRule methodRule = artProfile.getMethodRule(methodReference);
    inspector.accept(new ArtProfileMethodRuleInspector(methodRule));
    return this;
  }
}
