// Copyright (c) 2019, 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.

// Warning: This requires Java 9+ to be compiled (private interface methods)
// This file builds all the possible combinations of private members:
// - static VS non-static
// - fields VS methods
// - multiple nesting levels
// - nested interfaces
// Note: Inner interfaces have to be static.
// Then the accessPrivate methods generate all possibles calls.
// Each instance is created through a private constructor to test them too.
@SuppressWarnings("WeakerAccess")
public class NestHostExample {

  private String method() {
    return "hostMethod";
  }

  private static String staticMethod() {
    return "staticHostMethod";
  }

  private String field;
  private static String staticField = "staticField";

  private NestHostExample(String field) {
    this.field = field;
  }

  public StaticNestMemberInner createStaticNestMemberInner(String field) {
    return new StaticNestMemberInner(field);
  }

  public NestMemberInner createNestMemberInner(String field) {
    return new NestMemberInner(field);
  }

  @SuppressWarnings("static-access") // we want to test that too.
  public String accessPrivate(
      NestHostExample o0,
      StaticNestMemberInner o1,
      StaticNestMemberInner.StaticNestMemberInnerInner o2,
      NestMemberInner o3,
      NestMemberInner.NestMemberInnerInner o4) {
    return o0.field
        + o0.staticField
        + NestHostExample.staticField
        + o0.method()
        + o0.staticMethod()
        + NestHostExample.staticMethod()
        + o1.field
        + o1.staticField
        + StaticNestMemberInner.staticField
        + o1.method()
        + o1.staticMethod()
        + StaticNestMemberInner.staticMethod()
        + o2.field
        + o2.staticField
        + StaticNestMemberInner.StaticNestMemberInnerInner.staticField
        + o2.method()
        + o2.staticMethod()
        + StaticNestMemberInner.StaticNestMemberInnerInner.staticMethod()
        + o3.field
        + o3.method()
        + o4.field
        + o4.method();
  }

  public String accessPrivateInterface(StaticNestInterfaceInner i1) {
    return i1.interfaceMethod() + StaticNestInterfaceInner.staticInterfaceMethod();
  }

  // Nested interface (has to be static)
  public interface StaticNestInterfaceInner {

    private String interfaceMethod() {
      return "staticInterfaceMethod";
    }

    private static String staticInterfaceMethod() {
      return "staticStaticInterfaceMethod";
    }

    public static NestHostExample createNestHostExample(String field) {
      return new NestHostExample(field);
    }

    @SuppressWarnings("static-access") // we want to test that too.
    default String accessPrivate(
        NestHostExample o0,
        StaticNestMemberInner o1,
        StaticNestMemberInner.StaticNestMemberInnerInner o2,
        NestMemberInner o3,
        NestMemberInner.NestMemberInnerInner o4) {
      return o0.field
          + o0.staticField
          + NestHostExample.staticField
          + o0.method()
          + o0.staticMethod()
          + NestHostExample.staticMethod()
          + o1.field
          + o1.staticField
          + StaticNestMemberInner.staticField
          + o1.method()
          + o1.staticMethod()
          + StaticNestMemberInner.staticMethod()
          + o2.field
          + o2.staticField
          + StaticNestMemberInner.StaticNestMemberInnerInner.staticField
          + o2.method()
          + o2.staticMethod()
          + StaticNestMemberInner.StaticNestMemberInnerInner.staticMethod()
          + o3.field
          + o3.method()
          + o4.field
          + o4.method();
    }

    default String accessPrivateInterface(StaticNestInterfaceInner i1) {
      return i1.interfaceMethod() + StaticNestInterfaceInner.staticInterfaceMethod();
    }
  }

  // Static Nest mates
  public static class StaticNestMemberInner {

    private String method() {
      return "nest1SMethod";
    }

    private static String staticMethod() {
      return "staticNest1SMethod";
    }

    private String field;
    private static String staticField = "staticNest1SField";

    private StaticNestMemberInner(String field) {
      this.field = field;
    }

    public static StaticNestMemberInnerInner createStaticNestMemberInnerInner(String field) {
      return new StaticNestMemberInnerInner(field);
    }

    public static class StaticNestMemberInnerInner implements StaticNestInterfaceInner {

      private String method() {
        return "nest2SMethod";
      }

      private static String staticMethod() {
        return "staticNest2SMethod";
      }

      private String field;
      private static String staticField = "staticNest2SField";

      private StaticNestMemberInnerInner(String field) {
        this.field = field;
      }

      @SuppressWarnings("static-access") // we want to test that too.
      public String accessPrivate(
          NestHostExample o0,
          StaticNestMemberInner o1,
          StaticNestMemberInner.StaticNestMemberInnerInner o2,
          NestMemberInner o3,
          NestMemberInner.NestMemberInnerInner o4) {
        return o0.field
            + o0.staticField
            + NestHostExample.staticField
            + o0.method()
            + o0.staticMethod()
            + NestHostExample.staticMethod()
            + o1.field
            + o1.staticField
            + StaticNestMemberInner.staticField
            + o1.method()
            + o1.staticMethod()
            + StaticNestMemberInner.staticMethod()
            + o2.field
            + o2.staticField
            + StaticNestMemberInner.StaticNestMemberInnerInner.staticField
            + o2.method()
            + o2.staticMethod()
            + StaticNestMemberInner.StaticNestMemberInnerInner.staticMethod()
            + o3.field
            + o3.method()
            + o4.field
            + o4.method();
      }

      public String accessPrivateInterface(StaticNestInterfaceInner i1) {
        return i1.interfaceMethod() + StaticNestInterfaceInner.staticInterfaceMethod();
      }
    }
  }

  // Non static Nest mates
  public class NestMemberInner {

    private String method() {
      return "nest1Method";
    }

    private String field;

    private NestMemberInner(String field) {
      this.field = field;
    }

    public NestMemberInnerInner createNestMemberInnerInner(String field) {
      return new NestMemberInnerInner(field);
    }

    public class NestMemberInnerInner {

      private String method() {
        return "nest2Method";
      }

      private String field;

      private NestMemberInnerInner(String field) {
        this.field = field;
      }

      @SuppressWarnings("static-access") // we want to test that too.
      public String accessPrivate(
          NestHostExample o0,
          StaticNestMemberInner o1,
          StaticNestMemberInner.StaticNestMemberInnerInner o2,
          NestMemberInner o3,
          NestMemberInner.NestMemberInnerInner o4) {
        return o0.field
            + o0.staticField
            + NestHostExample.staticField
            + o0.method()
            + o0.staticMethod()
            + NestHostExample.staticMethod()
            + o1.field
            + o1.staticField
            + StaticNestMemberInner.staticField
            + o1.method()
            + o1.staticMethod()
            + StaticNestMemberInner.staticMethod()
            + o2.field
            + o2.staticField
            + StaticNestMemberInner.StaticNestMemberInnerInner.staticField
            + o2.method()
            + o2.staticMethod()
            + StaticNestMemberInner.StaticNestMemberInnerInner.staticMethod()
            + o3.field
            + o3.method()
            + o4.field
            + o4.method();
      }

      public String accessPrivateInterface(StaticNestInterfaceInner i1) {
        return i1.interfaceMethod() + StaticNestInterfaceInner.staticInterfaceMethod();
      }
    }
  }

  @SuppressWarnings("all") // do not know how to remove the redundant i1 variable
  public static void main(String[] args) {
    NestHostExample o0 = StaticNestInterfaceInner.createNestHostExample("field");
    StaticNestMemberInner o1 = o0.createStaticNestMemberInner("nest1SField");
    StaticNestMemberInner.StaticNestMemberInnerInner o2 =
        o1.createStaticNestMemberInnerInner("nest2SField");
    NestMemberInner o3 = o0.createNestMemberInner("nest1Field");
    NestMemberInner.NestMemberInnerInner o4 = o3.createNestMemberInnerInner("nest2Field");

    StaticNestInterfaceInner i1 = o2;

    System.out.println(o0.accessPrivate(o0, o1, o2, o3, o4));
    System.out.println(o2.accessPrivate(o0, o1, o2, o3, o4));
    System.out.println(o4.accessPrivate(o0, o1, o2, o3, o4));
    System.out.println(i1.accessPrivate(o0, o1, o2, o3, o4));

    System.out.println(o0.accessPrivateInterface(i1));
    System.out.println(o2.accessPrivateInterface(i1));
    System.out.println(o4.accessPrivateInterface(i1));
    System.out.println(i1.accessPrivateInterface(i1));

    // Expected results: 4x
    // fieldstaticFieldstaticFieldhostMethodstaticHostMethodstaticHostMethodnest1SField
    //  staticNest1SFieldstaticNest1SFieldnest1SMethodstaticNest1SMethodstaticNest1SMethod
    //  nest2SFieldstaticNest2SFieldstaticNest2SFieldnest2SMethodstaticNest2SMethod
    //  staticNest2SMethodnest1Fieldnest1Methodnest2Fieldnest2Method
    // staticInterfaceMethodstaticStaticInterfaceMethod
  }
}
