package cgmblelib.database.dao;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;

import java.util.List;

import cgmblelib.database.entity.PocDevice;
import io.reactivex.Flowable;

/**
 * Created by minyuchun on 2019/1/11.
 * operation about database device
 *
 * @author minyuchun
 */
@Dao
public interface DaoDevice {

    /**
     * 增加数据 -- 相同主键替换
     *
     * @param device 插入的设备
     * @return 返回插入的id
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insert(PocDevice device);

    /**
     * 删除数据
     *
     * @param device 删除的设备数据
     * @return 删除的数量
     */
    @Delete
    int delete(PocDevice... device);

    /**
     * 修改数据 -- 替换
     *
     * @param device 跟新的数据
     * @return 跟新的数量
     */
    @Update(onConflict = OnConflictStrategy.REPLACE)
    int update(PocDevice device);

    /**
     * 获取id值最大的设备信息 -- 持久化
     *
     * @return 持久化数据
     */
    @Query("SELECT * FROM device where id = (SELECT MAX(id) FROM device)")
    LiveData<PocDevice> getLiveDataLatestDevice();

    /**
     * 获取id值最大的设备信息 -- 持久化
     *
     * @return 持久化数据
     */
    @Query("SELECT * FROM device where id = (SELECT MAX(id) FROM device)")
    Flowable<PocDevice> getFlowableLatestDevice();

    /**
     * 获取id值最大的设备信息
     *
     * @return 获取最新的涉笔
     */
    @Query("SELECT * FROM device where id = (SELECT MAX(id) FROM device)")
    PocDevice getLatestDevice();

    /**
     * 根据设备ID获取设备信息
     *
     * @param deviceId 设备的id
     * @return 对应的设备
     */
    @Query("SELECT * FROM device where id = :deviceId")
    PocDevice getDeviceById(int deviceId);

    /**
     * 获取所有的设备信息 -- 持久化
     *
     * @return 获取所有的持久化数据
     */
    @Query("SELECT * from device")
    LiveData<List<PocDevice>> getLiveDataAllDevices();

    /**
     * 获取不用地址的所有设备信息 按照绑定日期降序排列
     *
     * @return 所有的地址不同的设备
     */
    @Query("SELECT * from device GROUP BY address ORDER BY bindDate DESC")
    List<PocDevice> getDifferentAddressDevices();

    /**
     * 通过地址获取该地址的所有设备信息
     *
     * @param address 设备地址
     * @return 该地址下的所有设备
     */
    @Query("SELECT * from device WHERE address = :address ORDER BY bindDate DESC")
    List<PocDevice> getDifferentDateDevicesByAddress(String address);


    /**
     * 通过绑定的用户id获取该地址的所有设备信息
     *
     * @return 该地址下的所有设备
     */
    @Query("SELECT * from device ORDER BY bindDate DESC")
    List<PocDevice> getAllDeviceWithUserId();

    /**
     * 通过绑定的用户id获取该地址的所有设备信息
     *
     * @return 该地址下的所有设备
     */
    @Query("SELECT * from device GROUP BY name ORDER BY bindDate DESC")
    List<PocDevice> getSingleAllDeviceWithId();


    /**
     * 取id值最大和address地址获取设备信息
     *
     * @param address 设备地址
     * @return 该地址下的所有设备
     */
    @Query("SELECT * FROM device where id = (SELECT MAX(id) FROM device) and address=:address")
    PocDevice getLatestDeviceByAddress(String address);

    @Query("DELETE FROM device")
    void clearDeviceTable();
}
