package com.narutohuo.xindazhou.ble.api

import com.narutohuo.xindazhou.ble.callback.DataCallback
import com.narutohuo.xindazhou.ble.model.BLEDevice
import com.narutohuo.xindazhou.ble.model.BLECommand
import com.narutohuo.xindazhou.ble.model.BLEResponse

/**
 * BLE服务接口
 * 
 * 提供蓝牙低功耗（BLE）通信能力
 * 封装新大洲本田蓝牙协议，提供高级API供业务模块调用
 */
interface BLEService {
    
    // ========== 基础连接功能 ==========
    
    /**
     * 开始扫描BLE设备
     * 
     * @param callback 扫描结果回调，返回BLEDevice
     */
    fun startScan(callback: (BLEDevice) -> Unit)
    
    /**
     * 停止扫描
     */
    fun stopScan()
    
    /**
     * 连接设备（自动完成握手和配对）
     * 
     * @param device 要连接的设备
     * @param userId 用户ID（16字节），用于握手认证
     * @param userType 用户类型（0x01=最高权限, 0x02=车主, 0x03=分享用户），用于握手认证
     * @param callback 连接结果回调，连接成功表示已完成握手和配对
     */
    fun connect(device: BLEDevice, userId: ByteArray, userType: Byte, callback: (BLEResponse) -> Unit)
    
    /**
     * 断开连接
     */
    fun disconnect()
    
    /**
     * 是否已连接
     */
    fun isConnected(): Boolean
    
    // ========== 高级连接功能（推荐使用） ==========
    
    /**
     * 初始化并连接（最简单的方式，一键完成所有设置和连接）
     * 
     * @param userId 用户ID（16字节），用于握手认证
     * @param userType 用户类型（0x01=最高权限, 0x02=车主, 0x03=分享用户）
     * @param onConnected 连接成功回调（已自动完成握手和配对）
     * @param onDisconnected 断开连接回调（可选）
     * @param onDataReceived 数据接收回调（可选）
     * @param onError 错误回调（可选）
     * @param scanTimeoutMs 扫描超时时间（毫秒），默认10秒
     */
    fun initializeAndConnect(
        userId: ByteArray,
        userType: Byte,
        onConnected: () -> Unit,
        onDisconnected: (() -> Unit)? = null,
        onDataReceived: ((ByteArray) -> Unit)? = null,
        onError: ((String) -> Unit)? = null,
        scanTimeoutMs: Long = 10000
    )
    
    /**
     * 扫描并连接设备（一键完成扫描+连接）
     * 
     * @param userId 用户ID（16字节），用于握手认证
     * @param userType 用户类型（0x01=最高权限, 0x02=车主, 0x03=分享用户）
     * @param scanTimeoutMs 扫描超时时间（毫秒），默认10秒
     * @param onScanning 扫描中回调（可选）
     * @param onDeviceFound 找到设备回调（可选）
     * @param onConnected 连接成功回调
     * @param onError 错误回调
     */
    fun scanAndConnect(
        userId: ByteArray,
        userType: Byte,
        scanTimeoutMs: Long = 10000,
        onScanning: (() -> Unit)? = null,
        onDeviceFound: ((BLEDevice) -> Unit)? = null,
        onConnected: () -> Unit,
        onError: (String) -> Unit
    )
    
    /**
     * 设置连接状态监听器（连接/断开时自动回调）
     * 
     * @param onConnected 连接成功回调
     * @param onDisconnected 断开连接回调
     * @param onError 错误回调
     */
    fun setConnectionListener(
        onConnected: () -> Unit,
        onDisconnected: () -> Unit,
        onError: (String) -> Unit
    )
    
    // ========== 协议封装功能（高级API，业务模块直接调用） ==========
    
    /**
     * 发送指令
     * 
     * @param command BLE指令（包含功能码、指令类型、应用数据）
     * @param callback 指令响应回调
     */
    fun sendCommand(command: BLECommand, callback: (BLEResponse) -> Unit)
    
    /**
     * 发送应用控制指令（业务模块常用）
     * 
     * @param instructionType 指令类型（如：设撤防、上下电、寻车等）
     * @param data 指令参数数据
     * @param callback 响应回调
     */
    fun sendAppControlCommand(instructionType: Byte, data: ByteArray, callback: (BLEResponse) -> Unit)
    
    /**
     * 发送系统控制指令（业务模块常用）
     * 
     * @param instructionType 指令类型（如：感应解锁、氛围灯等）
     * @param data 指令参数数据
     * @param callback 响应回调
     */
    fun sendSystemControlCommand(instructionType: Byte, data: ByteArray, callback: (BLEResponse) -> Unit)
    
    /**
     * 查询车辆信息
     * 
     * @param callback 响应回调，返回车辆信息数据
     */
    fun queryVehicleInfo(callback: (BLEResponse) -> Unit)
    
    // ========== 便捷方法（业务层常用操作） ==========
    
    /**
     * 设防/撤防
     * 
     * @param enabled true=设防, false=撤防
     * @param callback 响应回调
     */
    fun setDefense(enabled: Boolean, callback: (BLEResponse) -> Unit)
    
    /**
     * 上电
     * 
     * @param callback 响应回调
     */
    fun powerOn(callback: (BLEResponse) -> Unit)
    
    /**
     * 下电
     * 
     * @param callback 响应回调
     */
    fun powerOff(callback: (BLEResponse) -> Unit)
    
    /**
     * 寻车
     * 
     * @param callback 响应回调
     */
    fun findCar(callback: (BLEResponse) -> Unit)
    
    /**
     * 打开座桶锁
     * 
     * @param callback 响应回调
     */
    fun unlockSeat(callback: (BLEResponse) -> Unit)
    
    /**
     * 打开龙头锁
     * 
     * @param callback 响应回调
     */
    fun unlockHandlebar(callback: (BLEResponse) -> Unit)
    
    /**
     * 关闭龙头锁
     * 
     * @param callback 响应回调
     */
    fun lockHandlebar(callback: (BLEResponse) -> Unit)
    
    /**
     * 打开尾箱锁
     * 
     * @param callback 响应回调
     */
    fun unlockTrunk(callback: (BLEResponse) -> Unit)
    
    /**
     * 关闭尾箱锁
     * 
     * @param callback 响应回调
     */
    fun lockTrunk(callback: (BLEResponse) -> Unit)
    
    /**
     * 设置感应解锁开关
     * 
     * @param enabled true=开启, false=关闭
     * @param callback 响应回调
     */
    fun setSensorUnlock(enabled: Boolean, callback: (BLEResponse) -> Unit)
    
    /**
     * 设置氛围灯开关
     * 
     * @param enabled true=开启, false=关闭
     * @param callback 响应回调
     */
    fun setAmbientLight(enabled: Boolean, callback: (BLEResponse) -> Unit)
    
    /**
     * 设置氛围灯颜色
     * 
     * @param r 红色分量 (0-255)
     * @param g 绿色分量 (0-255)
     * @param b 蓝色分量 (0-255)
     * @param callback 响应回调
     */
    fun setAmbientLightColor(r: Int, g: Int, b: Int, callback: (BLEResponse) -> Unit)
    
    /**
     * 设置自动下电时间
     * 
     * @param timeSeconds 时间（秒），范围：0-60000
     * @param callback 响应回调
     */
    fun setAutoPowerOffTime(timeSeconds: Int, callback: (BLEResponse) -> Unit)
    
    /**
     * 设置蓝牙音箱音量
     * 
     * @param volume 音量 (0-100)
     * @param callback 响应回调
     */
    fun setSpeakerVolume(volume: Int, callback: (BLEResponse) -> Unit)
    
    // ========== 数据接收监听 ==========
    
    /**
     * 设置数据接收监听器
     * 
     * @param listener 接收到的数据回调
     */
    fun setDataReceivedListener(listener: DataCallback)
    
    // ========== 底层功能（如果需要直接操作） ==========
    
    /**
     * 发送原始数据（底层API，不推荐业务模块直接使用）
     * 
     * @param data 原始数据（二进制）
     * @param callback 响应回调
     */
    fun writeRawData(data: ByteArray, callback: (BLEResponse) -> Unit)
}

