//
//  RecordingOverlay.swift
//  ylgamehall
//
//  录音浮层 SwiftUI 视图（**UI 内部实现**，不影响 H5 契约）。
//
//  按 CLAUDE.md 「原则 B 原生内部自由」，UI 设计与 daoqi 不一致：
//  - daoqi 是 ChatVoiceRecorderVC.xib 125×130 老式弹窗 + UIImageView 波形 +
//    "录音剩下:Ns秒" 文本
//  - 新外壳改用现代 SwiftUI：半透明黑底胶囊 + SF Symbols 麦克风 + 光晕动画 +
//    倒计时文本
//

import SwiftUI

struct RecordingOverlay: View {

    @ObservedObject var recorder: VoiceRecorder

    /// 剩余秒数 (0 ~ maxDuration)
    private var remaining: TimeInterval {
        max(0, VoiceRecorder.maxDuration - recorder.elapsed)
    }

    /// 倒计时提示，仅最后 10 秒显示秒数（对齐 daoqi
    /// ChatVoiceRecorderVC.m:233-236 「剩 10s 显示倒计时」逻辑）。
    private var hint: String {
        if remaining < 10 {
            "录音剩下:\(Int(ceil(remaining)))秒"
        } else {
            "松开发送"
        }
    }

    private var hintColor: Color {
        remaining < 10 ? .yellow : .white.opacity(0.85)
    }

    var body: some View {
        ZStack {
            // 全屏背景：阻止下层 H5 接收点击。touch 事件由
            // RecordingAwareWindow.touchObserver 旁路捕获，与本 view 的
            // hit-test 无关；这里只是视觉上的"接管屏幕"
            Color.black.opacity(0.001)
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .contentShape(Rectangle())

            VStack(spacing: 12) {
                MicrophoneWaveform(power: recorder.averagePower)
                    .frame(width: 72, height: 72)

                Text(hint)
                    .font(.system(size: 13, weight: .medium))
                    .foregroundStyle(hintColor)
            }
            .padding(.horizontal, 24)
            .padding(.vertical, 20)
            .background(
                .black.opacity(0.7),
                in: RoundedRectangle(cornerRadius: 16, style: .continuous)
            )
        }
        .ignoresSafeArea()
    }
}

/// 麦克风波形指示：根据 averagePower 缩放光晕圆。
private struct MicrophoneWaveform: View {
    let power: Float    // -160 ~ 0 dB

    /// dB 映射到 [0, 1]：截断 [-50, 0]，等距归一化。
    /// -50 dB 视作静音底噪，0 dB 视作峰值。
    private var level: CGFloat {
        let clamped = max(-50, min(0, power))
        return CGFloat((clamped + 50) / 50)
    }

    var body: some View {
        ZStack {
            Circle()
                .fill(.white.opacity(0.15 + Double(level) * 0.25))
                .scaleEffect(0.7 + level * 0.5)
                .animation(.easeOut(duration: 0.15), value: level)

            Image(systemName: "mic.fill")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .foregroundStyle(.white)
                .frame(width: 36, height: 36)
        }
    }
}
