// 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.kotlin.metadata.typealias_app

import com.android.tools.r8.kotlin.metadata.typealias_lib.API
import com.android.tools.r8.kotlin.metadata.typealias_lib.AlphaNaming
import com.android.tools.r8.kotlin.metadata.typealias_lib.Arr
import com.android.tools.r8.kotlin.metadata.typealias_lib.Arr2D
import com.android.tools.r8.kotlin.metadata.typealias_lib.Arr2DTester
import com.android.tools.r8.kotlin.metadata.typealias_lib.CWithConstructor
import com.android.tools.r8.kotlin.metadata.typealias_lib.CWithConstructorTester
import com.android.tools.r8.kotlin.metadata.typealias_lib.ClassWithCompanionC
import com.android.tools.r8.kotlin.metadata.typealias_lib.FunctionTester
import com.android.tools.r8.kotlin.metadata.typealias_lib.Impl
import com.android.tools.r8.kotlin.metadata.typealias_lib.InterfaceTester
import com.android.tools.r8.kotlin.metadata.typealias_lib.MyAdvancedMap
import com.android.tools.r8.kotlin.metadata.typealias_lib.MyI
import com.android.tools.r8.kotlin.metadata.typealias_lib.MyMapToSetOfInt
import com.android.tools.r8.kotlin.metadata.typealias_lib.OuterNested
import com.android.tools.r8.kotlin.metadata.typealias_lib.OuterNestedInner
import com.android.tools.r8.kotlin.metadata.typealias_lib.OuterTester
import com.android.tools.r8.kotlin.metadata.typealias_lib.SimpleClassTester
import com.android.tools.r8.kotlin.metadata.typealias_lib.StillCWithConstructor
import com.android.tools.r8.kotlin.metadata.typealias_lib.UnderlyingTypeTest
import com.android.tools.r8.kotlin.metadata.typealias_lib.UnusedTypeArgument
import com.android.tools.r8.kotlin.metadata.typealias_lib.VerticalClassMergingTester
import com.android.tools.r8.kotlin.metadata.typealias_lib.seq
import com.android.tools.r8.kotlin.metadata.typealias_lib.IntSet as IntSet1

class ProgramClass : Impl() {
  override fun foo(): API {
    super.foo()
    println("Program::foo")
    return this
  }
}

fun testUnusedArgument() {
  val u = UnusedTypeArgument<Int>();
}

fun testSimpleClass() {
  val simple = object : AlphaNaming() { }
  println(SimpleClassTester.f(SimpleClassTester.g(simple)).y)
}

fun testArr2D() {
  val arr1d : Arr<Int> = Arr(42);
  val arr2d : Arr2D<Int> = Arr2D(arr1d);
  println(Arr2DTester.f(Arr2DTester.g(arr2d)).x.x);
}

fun testInterface() {
  val myInstance = object : MyI {
    override fun f() {
      println("42");
    }
  }
  InterfaceTester.f(InterfaceTester.g(myInstance)).f()

  val map : MyMapToSetOfInt<Int> = HashMap();
  val set : IntSet1 = mutableSetOf(42);
  map.put(1, set);
  println(InterfaceTester.i(InterfaceTester.h(map))[1]?.iterator()?.next() ?: "");
}

fun testFunctionTypes() {
  FunctionTester.f(FunctionTester.g({ i : Int, a : Any ->
    println(i)
    println(a)
  }))(42, "42")
  FunctionTester.h(FunctionTester.i({ b ->
    println(b)
    false
  }))(true)
}

fun testNestedClasses() {
  val nested = OuterNested(42);
  val myInner : OuterNestedInner = nested.Inner(1)
  println(OuterTester.g(nested).y)
  println(OuterTester.f(myInner).x)
}

fun testCompanion() {
  ClassWithCompanionC.foo;
}

fun testConstructor() {
  println(CWithConstructorTester.f(CWithConstructorTester.g(CWithConstructor(42))).x);
}

fun testUnderlyingType() {
  val cWithConstructor = StillCWithConstructor(42)
  println(UnderlyingTypeTest.f(UnderlyingTypeTest.g(cWithConstructor)).x)
  val advancedMap : MyAdvancedMap = HashMap();
  val nested = OuterNested(42);
  val myInner : OuterNestedInner = nested.Inner(1)
  advancedMap.put(nested, myInner);
  val sameMap = UnderlyingTypeTest.h(UnderlyingTypeTest.i(advancedMap))
  println(sameMap.get(nested)?.x)
}

fun testVerticalClassMerging() {
  val apiImpl = VerticalClassMergingTester.produce()
  VerticalClassMergingTester.passThrough(apiImpl).foo()
}

fun main() {
  val instance = ProgramClass()
  val l = seq(instance)
  for (api in l) {
    println(api == api.foo())
    println(api.hey())
  }
  testUnusedArgument()
  testSimpleClass()
  testArr2D()
  testInterface()
  testFunctionTypes()
  testNestedClasses()
  testCompanion()
  testConstructor()
  testUnderlyingType();
  testVerticalClassMerging();
}
