//
//  ContentView.swift
//  MyFirstARApp
//
//  Created by zjucs on 2025/4/5.
//

import SwiftUI
import RealityKit

// 主视图结构体
struct ContentView : View {
    // 模型位置状态变量，使用SIMD3<Float>表示3D空间中的位置(x,y,z)
    @State var modelPosition: SIMD3<Float> = [0, 0.025, 0]
    // 模型尺寸状态变量，控制模型在3D空间中的大小
    @State var modelSize: SIMD3<Float> = [0.05, 0.05, 0.05]
    
    var body: some View {
        VStack {
            // AR视图容器，传入模型位置和尺寸的绑定
            ARViewContainer(modelPosition: $modelPosition, modelSize: $modelSize)
                .edgesIgnoringSafeArea(.all)
            
            // 移动模型按钮 - 每次点击将模型沿x轴移动0.05米
            Button("Move Model") {
                modelPosition += [0.05, 0, 0]
            }.frame(width: 200, height: 50)
            
            // 放大模型按钮 - 增加模型尺寸并稍微抬高位置
            Button("Extend Model") {
                modelSize += [0.01, 0.01, 0.01]  // 增加尺寸
                modelPosition += [0, 0.005, 0]     // 抬高位置保持模型底部不陷入平面
            }.frame(width: 200, height: 50)
            
            // 重置模型按钮 - 恢复初始大小和位置
            Button("Reset Model") {
                modelSize = [0.05, 0.05, 0.05]
                modelPosition = [0, 0.025, 0]
            }.frame(width: 200, height: 50)
        }
    }
}

// AR视图容器，将RealityKit的ARView包装为SwiftUI可用的视图
struct ARViewContainer: UIViewRepresentable {
    // 绑定的模型位置（从父视图传入）
    @Binding var modelPosition: SIMD3<Float>
    // 模型颜色状态（默认为灰色）
    @State var modelColor = UIColor.gray
    // 绑定的模型尺寸（从父视图传入）
    @Binding var modelSize: SIMD3<Float>
    // 模型表面粗糙度（0-1之间）
    @State var modelRoughness: Float = 0.15
    // 模型是否具有金属质感
    @State var modelMetallic = true

    // 创建AR视图（UIKit视图）
    func makeUIView(context: Context) -> ARView {
        // 初始化ARView
        let arView = ARView(frame: .zero)
        
        // 创建立方体网格（1米大小，0.05米圆角）
        let mesh = MeshResource.generateBox(size: 1, cornerRadius: 0.05)
        
        // 创建材质（颜色，粗糙度，金属质感）
        let material = SimpleMaterial(
            color: modelColor,
            roughness: MaterialScalarParameter(floatLiteral: modelRoughness),
            isMetallic: modelMetallic
        )
        
        // 创建模型实体（结合网格和材质）
        let model = ModelEntity(mesh: mesh, materials: [material])
        
        // 创建水平平面锚点（检测真实世界的水平面，至少0.2*0.2的大小）
        let anchor = AnchorEntity(.plane(
            .horizontal,
            classification: .any,
            minimumBounds: SIMD2<Float>(0.2, 0.2)
        ))
        
        // 将模型添加为锚点的子元素
        anchor.children.append(model)
        
        // 将锚点添加到AR场景中
        arView.scene.anchors.append(anchor)
        
        // 设置模型的初始位置和scale
        model.scale = modelSize
        model.transform.translation = modelPosition
        
        // 将模型实体保存到协调器中以便后续更新
        context.coordinator.modelEntity = model
        
        return arView
    }
    
    // 更新AR视图（当状态变化时调用）
    func updateUIView(_ uiView: ARView, context: Context) {
        // 从协调器中获取模型实体
        guard let model = context.coordinator.modelEntity else {
            return
        }
        
        // 更新模型尺寸和位置
        model.scale = modelSize
        model.transform.translation = modelPosition
        
        // 调试输出
        print("New position: \(model.transform.translation)")
        print("New scale: \(model.scale)")
    }
    
    // 创建协调器实例（用于管理模型实体）
    func makeCoordinator() -> Coordinator {
        Coordinator()
    }
    
    // 协调器类，在SwiftUI和UIKit之间桥接数据和事件处理
    class Coordinator {
        var modelEntity: ModelEntity? // 当前模型实体的引用
    }
}

// 预览提供器
#Preview {
    ContentView()
}
