package com.narutohuo.xindazhou.user.ui.profile

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import com.google.android.material.button.MaterialButton
import com.narutohuo.xindazhou.R
import com.narutohuo.xindazhou.user.ui.viewmodel.UserViewModel
import com.narutohuo.xindazhou.user.ui.viewmodel.UserViewModelFactory
import kotlinx.coroutines.launch

/**
 * 用户Fragment - 包含 SocketIO 测试功能
 * 
 * 功能：
 * 1. SocketIO 连接测试
 * 2. 发送寻车指令测试（上行）
 * 3. 接收报警消息测试（下行）
 * 
 * 架构：MVVM
 * - View (Fragment): 只负责 UI 初始化和状态观察
 * - ViewModel: 管理业务逻辑和状态
 * - SocketIOManager: Socket.IO 管理器（base-common，已在 AppInitializer 中统一初始化）
 */
class UserFragment : Fragment() {

    private val viewModel: UserViewModel by viewModels {
        UserViewModelFactory(requireContext().applicationContext as android.app.Application)
    }

    private lateinit var tvConnectionStatus: TextView
    private lateinit var btnConnect: MaterialButton
    private lateinit var btnFindVehicle: MaterialButton
    private lateinit var tvLog: TextView

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_user_socket_test, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // 初始化视图
        tvConnectionStatus = view.findViewById(R.id.tvConnectionStatus)
        btnConnect = view.findViewById(R.id.btnConnect)
        btnFindVehicle = view.findViewById(R.id.btnFindVehicle)
        tvLog = view.findViewById(R.id.tvLog)

        // 设置按钮点击事件
        btnConnect.setOnClickListener {
            if (viewModel.uiState.value.isConnected) {
                viewModel.disconnect()
            } else {
                viewModel.connect()
            }
        }

        btnFindVehicle.setOnClickListener {
            viewModel.sendFindVehicleCommand()
        }

        // 观察 UI 状态
        observeUiState()

        // 观察报警消息
        observeAlarmMessage()

        // 观察错误消息
        observeErrorMessage()
    }

    /**
     * 观察 UI 状态（连接状态、日志列表）
     */
    private fun observeUiState() {
        lifecycleScope.launch {
            viewModel.uiState.collect { state ->
                // 更新连接状态显示
                tvConnectionStatus.text = "连接状态：${if (state.isConnected) "已连接" else "未连接"}"
                
                // 更新连接按钮文本
                btnConnect.text = if (state.isConnected) "断开连接" else "连接SocketIO"
                
                // 更新寻车按钮状态
                btnFindVehicle.isEnabled = state.isConnected
                
                // 更新日志显示
                tvLog.text = state.logs.joinToString("\n")
                
                // 自动滚动到底部
                tvLog.post {
                    val scrollView = tvLog.parent as? android.widget.ScrollView
                    scrollView?.fullScroll(View.FOCUS_DOWN)
                }
            }
        }
    }

    /**
     * 观察报警消息
     */
    private fun observeAlarmMessage() {
        lifecycleScope.launch {
            viewModel.alarmMessage.collect { alarm ->
                alarm?.let {
                    Toast.makeText(requireContext(), "收到车辆报警！", Toast.LENGTH_LONG).show()
                }
            }
        }
    }

    /**
     * 观察错误消息
     */
    private fun observeErrorMessage() {
        lifecycleScope.launch {
            viewModel.errorMessage.collect { error ->
                error?.let {
                    Toast.makeText(requireContext(), error, Toast.LENGTH_SHORT).show()
                    viewModel.clearErrorMessage()
                }
            }
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        // 注意：不在这里断开连接，因为是单例，其他页面可能还需要使用
        // 如果需要断开，可以在应用退出时统一处理
    }
}
