package cn.wandersnail.ble;

import android.bluetooth.BluetoothGattCharacteristic;

/**
 * 写特征的配置
 * 
 * date: 2019/8/9 18:06
 * author: zengfansheng
 */
public class WriteOptions {
    final int packageWriteDelayMillis;
    final int requestWriteDelayMillis;
    int packageSize;
    final boolean isWaitWriteResult;
    final int writeType;
    final boolean useMtuAsPackageSize;

    private WriteOptions(Builder builder) {
        packageWriteDelayMillis = builder.packageWriteDelayMillis;
        requestWriteDelayMillis = builder.requestWriteDelayMillis;
        packageSize = builder.packageSize;
        isWaitWriteResult = builder.isWaitWriteResult;
        writeType = builder.writeType;
        useMtuAsPackageSize = builder.useMtuAsPackageSize;
    }

    /**
     * 两次写数据到特征的时间间隔
     */
    public int getPackageWriteDelayMillis() {
        return packageWriteDelayMillis;
    }

    /**
     * 两次写请求的时间间隔,和{@link #getPackageWriteDelayMillis()}不同的是,一次写请求可能会分包发送。
     * 一个是请求与请求的间隔,一个是包与包的间隔
     */
    public int getRequestWriteDelayMillis() {
        return requestWriteDelayMillis;
    }

    /**
     * 一次向特征写入的字节数
     */
    public int getPackageSize() {
        return packageSize;
    }

    /**
     * 是否等待写入结果回调再写下一包数据
     */
    public boolean isWaitWriteResult() {
        return isWaitWriteResult;
    }

    /**
     * 写入模式
     */
    public int getWriteType() {
        return writeType;
    }

    public static class Builder {
        private int packageWriteDelayMillis = 0;
        private int requestWriteDelayMillis = -1;
        private int packageSize = 20;
        private boolean isWaitWriteResult = true;
        private int writeType = -1;
        private boolean useMtuAsPackageSize = false;

        /**
         * 两次写数据到特征的时间间隔
         */
        public Builder setPackageWriteDelayMillis(int packageWriteDelayMillis) {
            this.packageWriteDelayMillis = packageWriteDelayMillis;
            return this;
        }

        /**
         * 两次写请求的时间间隔,和{@link #packageWriteDelayMillis}不同的是,一次写请求可能会分包发送。
         * 一个是请求与请求的间隔,一个是包与包的间隔
         */
        public Builder setRequestWriteDelayMillis(int requestWriteDelayMillis) {
            this.requestWriteDelayMillis = requestWriteDelayMillis;
            return this;
        }

        /**
         * 一次向特征写入的字节数
         */
        public Builder setPackageSize(int packageSize) {
            if (packageSize > 0) {
                this.packageSize = packageSize;
            }
            return this;
        }

        /**
         * 是否等待写入结果回调再写下一包数据
         */
        public Builder setWaitWriteResult(boolean waitWriteResult) {
            isWaitWriteResult = waitWriteResult;
            return this;
        }

        /**
         * 设置写入模式
         *
         * @param writeType {@link BluetoothGattCharacteristic#WRITE_TYPE_DEFAULT}
         *                  <br>{@link BluetoothGattCharacteristic#WRITE_TYPE_NO_RESPONSE}
         *                  <br>{@link BluetoothGattCharacteristic#WRITE_TYPE_SIGNED}
         */
        public Builder setWriteType(int writeType) {
            if (writeType == BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT ||
                    writeType == BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE ||
                    writeType == BluetoothGattCharacteristic.WRITE_TYPE_SIGNED) {
                this.writeType = writeType;
            }            
            return this;
        }

        /**
         * 设置将MTU作为包大小,并且{@link #setPackageSize(int)}设置的值将被忽略。真实数据包大小 = mtu - 3
         */
        public Builder setMtuAsPackageSize() {
            useMtuAsPackageSize = true;
            return this;
        }
        
        public WriteOptions build() {
            return new WriteOptions(this);
        }
    }
}