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

package nesthostexample;

import java.util.List;

// 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 {

  public static final String ALL_RESULT_LINE =
      String.join(
          ", ",
          new String[] {
            "field",
            "staticField",
            "staticField",
            "hostMethod",
            "staticHostMethod",
            "staticHostMethod",
            "nest1SField",
            "staticNest1SField",
            "staticNest1SField",
            "nest1SMethod",
            "staticNest1SMethod",
            "staticNest1SMethod",
            "nest2SField",
            "staticNest2SField",
            "staticNest2SField",
            "nest2SMethod",
            "staticNest2SMethod",
            "staticNest2SMethod",
            "nest1Field",
            "nest1Method",
            "nest2Field",
            "nest2Method"
          });

  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 enum ExampleEnumCompilation {
    CASE1,
    CASE2,
    CASE3;
  }

  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 join(
        ", ",
        new String[] {
          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 join(
          ", ",
          new String[] {
            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 join(
            ", ",
            new String[] {
              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 join(
            ", ",
            new String[] {
              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();
      }
    }
  }

  public static String join(String separator, String[] strings) {
    StringBuilder sb = new StringBuilder(strings[0]);
    for (int i = 1; i < strings.length; i++) {
      sb.append(separator).append(strings[i]);
    }
    return sb.toString();
  }

  @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));

    System.out.println(ExampleEnumCompilation.values().length);
  }

  public static List<String> getExpectedResult() {
    return List.of(
        ALL_RESULT_LINE,
        ALL_RESULT_LINE,
        ALL_RESULT_LINE,
        ALL_RESULT_LINE,
        "staticInterfaceMethodstaticStaticInterfaceMethod",
        "staticInterfaceMethodstaticStaticInterfaceMethod",
        "staticInterfaceMethodstaticStaticInterfaceMethod",
        "staticInterfaceMethodstaticStaticInterfaceMethod",
        "3");
  }
}
