package com.dong.demo013.debug

// ========== 类型别名必须在顶层定义 ==========
typealias UserId = Long
typealias UserName = String
typealias Callback = (String) -> Unit

/**
 * Kotlin 全部基础变量类型演示类
 */
class DebugAllTypesData {

    // ========== 1. 数字类型 ==========
    // 整数类型
    val byteValue: Byte = 127                    // 8位，范围：-128 ~ 127
    val shortValue: Short = 32767                // 16位，范围：-32768 ~ 32767
    val intValue: Int = 2147483647               // 32位，范围：-2^31 ~ 2^31-1
    val longValue: Long = 9223372036854775807L   // 64位，范围：-2^63 ~ 2^63-1

    // 浮点类型
    val floatValue: Float = 3.14159f             // 32位，单精度浮点数
    val doubleValue: Double = 3.141592653589793  // 64位，双精度浮点数

    // 十六进制、二进制字面量
    val hexValue: Int = 0xFF                     // 十六进制，255
    val binaryValue: Int = 0b00001011            // 二进制，11

    // 数字下划线（提高可读性）
    val largeNumber: Int = 1_000_000             // 一百万

    // ========== 2. 无符号类型 ==========
    val uByteValue: UByte = 255u                 // 0 ~ 255
    val uShortValue: UShort = 65535u             // 0 ~ 65535
    val uIntValue: UInt = 4294967295u            // 0 ~ 2^32-1
    val uLongValue: ULong = 18446744073709551615uL  // 0 ~ 2^64-1

    // ========== 3. 字符类型 ==========
    val charValue: Char = 'A'                    // 单个字符
    val charUnicode: Char = '\u0041'             // Unicode 字符，也是 'A'
    val charEscape: Char = '\n'                  // 转义字符：\t, \b, \n, \r, \', \", \\, \$

    // ========== 4. 布尔类型 ==========
    val booleanTrue: Boolean = true              // 真值
    val booleanFalse: Boolean = false            // 假值

    // ========== 5. 字符串类型 ==========
    val stringValue: String = "Hello Kotlin"     // 普通字符串
    val stringTemplate: String = "值是: $intValue"  // 字符串模板
    val stringExpression: String = "和是: ${10 + 20}"  // 表达式模板
    val multilineString: String = """
        ┌─────────────┐
        │  多行字符串  │
        │  支持换行   │
        └─────────────┘
    """.trimIndent()

    // 原始字符串
    val rawString: String = """ 
        \n 不会被转义
        \t 原样输出
    """.trimIndent()

    // ========== 6. 数组类型 ==========
    // 普通数组（对象数组）
    val intArray: Array<Int> = arrayOf(1, 2, 3, 4, 5)
    val stringArray: Array<String> = arrayOf("Kotlin", "Java", "Python")
    val mixedArray: Array<Any> = arrayOf(1, "two", 3.0, true)  // 混合类型

    // 基本类型数组（避免装箱，性能更好）
    val byteArray: ByteArray = byteArrayOf(1, 2, 3)
    val shortArray: ShortArray = shortArrayOf(10, 20, 30)
    val intPrimitiveArray: IntArray = intArrayOf(100, 200, 300)
    val longPrimitiveArray: LongArray = longArrayOf(1000L, 2000L, 3000L)
    val floatPrimitiveArray: FloatArray = floatArrayOf(1.1f, 2.2f, 3.3f)
    val doublePrimitiveArray: DoubleArray = doubleArrayOf(1.1, 2.2, 3.3)
    val charPrimitiveArray: CharArray = charArrayOf('A', 'B', 'C')
    val booleanPrimitiveArray: BooleanArray = booleanArrayOf(true, false, true)

    // 无符号数组
    val uIntArray: UIntArray = uintArrayOf(1u, 2u, 3u)
    val uLongArray: ULongArray = ulongArrayOf(1uL, 2uL, 3uL)

    // 使用构造函数创建数组
    val sizedArray: Array<Int?> = arrayOfNulls(5)  // 大小为5的空数组
    val initArray: Array<Int> = Array(5) { i -> i * 2 }  // [0, 2, 4, 6, 8]

    // ========== 7. 可空类型 ==========
    var nullableString: String? = null            // 可以为空的字符串
    var nonNullableString: String = "Hello"       // 不可为空
    // nonNullableString = null  // 编译错误！

    // 安全调用操作符
    fun getLength(str: String?): Int? {
        return str?.length  // 如果 str 为 null，返回 null，否则返回长度
    }

    // Elvis 操作符
    fun getLengthOrDefault(str: String?): Int {
        return str?.length ?: 0  // 如果为 null，返回默认值 0
    }

    // ========== 8. 类型别名 ==========

    val userId: UserId = 12345L
    val userName: UserName = "Alice"
    val callback: Callback = { println(it) }

    // ========== 9. 特殊类型 ==========
    // Unit 类型（类似 Java 的 void，但它是真正的类型）
    fun unitFunction(): Unit {
        println("返回 Unit")
        // 可以省略 return 或写 return Unit
    }

    // Nothing 类型（永远不会返回，比如抛出异常或无限循环）
    fun nothingFunction(): Nothing {
        throw IllegalArgumentException("永远不会返回")
    }

    // Any 类型（所有非空类型的超类，类似 Java 的 Object）
    val anyValue: Any = "可以是任何类型"
    val anyNumber: Any = 42
    val anyBoolean: Any = true

    // ========== 打印所有变量 ==========
    fun printAllTypes() {
        println("=== 数字类型 ===")
        println("Byte: $byteValue")
        println("Short: $shortValue")
        println("Int: $intValue")
        println("Long: $longValue")
        println("Float: $floatValue")
        println("Double: $doubleValue")
        println("十六进制: $hexValue")
        println("二进制: $binaryValue")
        println("带下划线的数字: $largeNumber")

        println("\n=== 无符号类型 ===")
        println("UByte: $uByteValue")
        println("UShort: $uShortValue")
        println("UInt: $uIntValue")
        println("ULong: $uLongValue")

        println("\n=== 字符和布尔类型 ===")
        println("Char: $charValue")
        println("Char Unicode: $charUnicode")
        println("Boolean True: $booleanTrue")
        println("Boolean False: $booleanFalse")

        println("\n=== 字符串类型 ===")
        println("String: $stringValue")
        println("字符串模板: $stringTemplate")
        println("表达式模板: $stringExpression")
        println("多行字符串:\n$multilineString")

        println("\n=== 数组类型 ===")
        println("Int Array: ${intArray.joinToString()}")
        println("String Array: ${stringArray.joinToString()}")
        println("Mixed Array: ${mixedArray.joinToString()}")
        println("Int Primitive Array: ${intPrimitiveArray.joinToString()}")
        println("Char Primitive Array: ${charPrimitiveArray.joinToString()}")
        println("初始化数组: ${initArray.joinToString()}")

        println("\n=== 可空类型 ===")
        println("nullableString 长度: ${getLength(nullableString)}")
        println("null 字符串默认长度: ${getLengthOrDefault(nullableString)}")

        println("\n=== 类型别名 ===")
        println("UserId: $userId")
        println("UserName: $userName")

        println("\n=== 特殊类型 ===")
        println("Any 类型示例: $anyValue, $anyNumber, $anyBoolean")
        unitFunction()
    }
}


//复杂对象
class ComplexClass {

    val complexClass1: ComplexClass1=ComplexClass1()
    val name: String="第一层"
}

class ComplexClass1 {
    val complexClass2: ComplexClass2=ComplexClass2()
    val name: String="第二层"
}

class ComplexClass2 {
    val name: String="第三层"
}