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

import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.inspector.ClassInspector;
import com.android.tools.r8.inspector.Inspector;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;

public class InspectorImpl implements Inspector {

  // This wrapping appears odd, but allows hooking in inspections on the impl type from tests.
  public static List<Consumer<InspectorImpl>> wrapInspections(
      Collection<Consumer<Inspector>> inspections) {
    if (inspections == null || inspections.isEmpty()) {
      return Collections.emptyList();
    }
    List<Consumer<InspectorImpl>> wrapped = new ArrayList<>(inspections.size());
    for (Consumer<Inspector> inspection : inspections) {
      wrapped.add(inspection::accept);
    }
    return wrapped;
  }

  public static void runInspections(
      List<Consumer<InspectorImpl>> inspections, DexApplication application) {
    if (inspections == null || inspections.isEmpty()) {
      return;
    }
    InspectorImpl inspector = new InspectorImpl(application);
    for (Consumer<InspectorImpl> inspection : inspections) {
      inspection.accept(inspector);
    }
  }

  private final DexApplication application;

  public InspectorImpl(DexApplication application) {
    this.application = application;
  }

  @Override
  public void forEachClass(Consumer<ClassInspector> inspection) {
    for (DexProgramClass clazz : application.classes()) {
      inspection.accept(new ClassInspectorImpl(clazz));
    }
  }
}
