import CoreImage.CIFilterBuiltins
import SwiftUI
import UIKit

// 登录界面：主登录＝应用内 Broker 账号登录（ASWebAuthenticationSession，直接输账号、无需另一台
// 设备）；扫码登录降级为可展开的备选（需另一台已登录设备扫码批准）。两条流程经 AuthManager。
struct LoginView: View
{
    @Environment(AuthManager.self) private var auth
    @State private var showQR = false

    var body: some View
    {
        VStack(spacing: 20)
        {
            Spacer()
            Text(t("app.brand"))
                .font(.largeTitle)
                .bold()

            // 主登录：应用内 broker 账号登录。
            Button { Task { await auth.startBrokerLogin() } }
            label:
            {
                Label(t("ios.login.broker"), systemImage: "person.crop.circle")
                    .frame(maxWidth: .infinity)
            }
            .buttonStyle(.glassProminent)
            .padding(.horizontal, 40)

            if !auth.statusText.isEmpty
            {
                Text(auth.statusText)
                    .font(.callout)
                    .foregroundStyle(auth.qrExpired ? Color.red : Color.secondary)
                    .multilineTextAlignment(.center)
                    .padding(.horizontal, 40)
            }

            // 备选：扫码登录（需另一台已登录设备）。展开时才发起二维码，避免无谓请求。
            DisclosureGroup(isExpanded: $showQR)
            {
                VStack(spacing: 16)
                {
                    qrArea
                    refreshButton
                    Text(t("ios.login.guide"))
                        .font(.footnote)
                        .foregroundStyle(.secondary)
                        .multilineTextAlignment(.center)
                }
                .padding(.top, 12)
            }
            label:
            {
                Text(t("ios.login.scanAlt"))
                    .font(.subheadline)
            }
            .padding(.horizontal, 40)
            .onChange(of: showQR)
            {
                if showQR, auth.qrPayload == nil { Task { await auth.startQRLogin() } }
            }

            Spacer()
        }
        .padding()
        .tint(.cdropAccent)
    }

    // 刷新二维码：失效后高亮（glassProminent），未失效时也常驻可手动刷新。两种玻璃样式类型
    // 不同，故经 @ViewBuilder 条件分支。
    @ViewBuilder
    private var refreshButton: some View
    {
        let button = Button { Task { await auth.startQRLogin() } }
        label: { Label(t("ios.login.refresh"), systemImage: "arrow.clockwise") }
        if auth.qrExpired { button.buttonStyle(.glassProminent) }
        else { button.buttonStyle(.glass) }
    }

    @ViewBuilder
    private var qrArea: some View
    {
        if let payload = auth.qrPayload, let img = qrImage(payload)
        {
            Image(uiImage: img)
                .interpolation(.none)
                .resizable()
                .frame(width: 220, height: 220)
                .padding(16)
                .background(.white, in: RoundedRectangle(cornerRadius: 16))
                .opacity(auth.qrExpired ? 0.25 : 1)            // 失效后置灰，视觉提示需刷新
                .overlay
                {
                    if auth.qrExpired
                    {
                        Image(systemName: "arrow.clockwise.circle.fill")
                            .font(.system(size: 56))
                            .foregroundStyle(.secondary)
                    }
                }
        }
        else
        {
            ProgressView()
                .frame(width: 220, height: 220)
        }
    }

    // CoreImage 内建二维码生成（无第三方依赖）。payload 是后端给的完整 /link?r=..&c=.. URL。
    private func qrImage(_ string: String) -> UIImage?
    {
        let filter = CIFilter.qrCodeGenerator()
        filter.message = Data(string.utf8)
        guard let output = filter.outputImage else { return nil }
        let scaled = output.transformed(by: CGAffineTransform(scaleX: 10, y: 10))
        let ctx = CIContext()
        guard let cg = ctx.createCGImage(scaled, from: scaled.extent) else { return nil }
        return UIImage(cgImage: cg)
    }
}
