package com.narutohuo.xindazhou.ble.api

import com.narutohuo.xindazhou.ble.callback.*
import com.narutohuo.xindazhou.ble.model.BLEDevice
import com.narutohuo.xindazhou.ble.model.BLECommand
import com.narutohuo.xindazhou.ble.model.BLEResponse
import com.narutohuo.xindazhou.ble.model.HandshakeCommand

/**
 * BLE服务接口
 * 
 * 提供蓝牙低功耗（BLE）通信能力
 * 封装新大洲本田蓝牙协议，提供高级API供业务模块调用
 */
interface BLEService {
    
    // ========== 基础连接功能 ==========
    
    /**
     * 开始扫描BLE设备
     * 
     * @param callback 扫描结果回调，返回BLEDevice
     */
    fun startScan(callback: (BLEDevice) -> Unit)
    
    /**
     * 停止扫描
     */
    fun stopScan()
    
    /**
     * 连接设备
     * 
     * @param device 要连接的设备
     * @param callback 连接结果回调（统一使用lambda）
     */
    fun connect(device: BLEDevice, callback: (BLEResponse) -> Unit)
    
    /**
     * 连接设备（兼容旧接口）
     * 
     * @param device 要连接的设备
     * @param callback 连接结果回调
     */
    @Deprecated("使用 lambda 回调方式", ReplaceWith("connect(device) { response -> ... }"))
    fun connect(device: BLEDevice, callback: ConnectCallback)
    
    /**
     * 断开连接
     */
    fun disconnect()
    
    /**
     * 是否已连接
     */
    fun isConnected(): Boolean
    
    // ========== 协议封装功能（高级API，业务模块直接调用） ==========
    
    /**
     * 握手认证
     * 
     * @param userId 用户ID（16字节）
     * @param userType 用户类型（0x01=最高权限, 0x02=车主, 0x03=分享用户）
     * @param callback 握手结果回调（统一使用lambda）
     */
    fun handshake(userId: ByteArray, userType: Byte, callback: (BLEResponse) -> Unit)
    
    /**
     * 握手认证（兼容旧接口）
     * 
     * @param userId 用户ID（16字节）
     * @param userType 用户类型（0x01=最高权限, 0x02=车主, 0x03=分享用户）
     * @param callback 握手结果回调
     */
    @Deprecated("使用 lambda 回调方式", ReplaceWith("handshake(userId, userType) { response -> ... }"))
    fun handshake(userId: ByteArray, userType: Byte, callback: HandshakeCallback)
    
    /**
     * 发送指令
     * 
     * @param command BLE指令（包含功能码、指令类型、应用数据）
     * @param callback 指令响应回调（统一使用lambda）
     */
    fun sendCommand(command: BLECommand, callback: (BLEResponse) -> Unit)
    
    /**
     * 发送指令（兼容旧接口）
     * 
     * @param command BLE指令（包含功能码、指令类型、应用数据）
     * @param callback 指令响应回调
     */
    @Deprecated("使用 lambda 回调方式", ReplaceWith("sendCommand(command) { response -> ... }"))
    fun sendCommand(command: BLECommand, callback: CommandCallback)
    
    /**
     * 发送应用控制指令（业务模块常用）
     * 
     * @param instructionType 指令类型（如：设撤防、上下电、寻车等）
     * @param data 指令参数数据
     * @param callback 响应回调（统一使用lambda）
     */
    fun sendAppControlCommand(instructionType: Byte, data: ByteArray, callback: (BLEResponse) -> Unit)
    
    /**
     * 发送系统控制指令（业务模块常用）
     * 
     * @param instructionType 指令类型（如：感应解锁、氛围灯等）
     * @param data 指令参数数据
     * @param callback 响应回调（统一使用lambda）
     */
    fun sendSystemControlCommand(instructionType: Byte, data: ByteArray, callback: (BLEResponse) -> Unit)
    
    /**
     * 查询车辆信息
     * 
     * @param callback 响应回调（统一使用lambda），返回车辆信息数据
     */
    fun queryVehicleInfo(callback: (BLEResponse) -> Unit)
    
    // ========== 数据接收监听 ==========
    
    /**
     * 设置数据接收监听器
     * 
     * @param listener 接收到的数据回调
     */
    fun setDataReceivedListener(listener: DataCallback)
    
    // ========== 底层功能（如果需要直接操作） ==========
    
    /**
     * 发送原始数据（底层API，不推荐业务模块直接使用）
     * 
     * @param data 原始数据（二进制）
     * @param callback 响应回调（统一使用lambda）
     */
    fun writeRawData(data: ByteArray, callback: (BLEResponse) -> Unit)
    
    /**
     * 发送原始数据（兼容旧接口）
     * 
     * @param data 原始数据（二进制）
     * @param callback 响应回调
     */
    @Deprecated("使用 lambda 回调方式", ReplaceWith("writeRawData(data) { response -> ... }"))
    fun writeRawData(data: ByteArray, callback: CommandCallback)
}

