package cgmblelib.database.source;

import androidx.lifecycle.LiveData;

import java.util.Date;
import java.util.List;

import cgmblelib.database.entity.PocGlucose;

/**
 * Created by minyuchun on 2019/10/25.
 *
 * @author minyuchun
 */
public interface SourceGlucose extends SourceBase {


    void delete(long deviceId, int glucoseId);

    void deleteAllGlucoseData();

    /**
     * 插入数据
     *
     * @param glucose 数据
     * @return 返回插入的id
     */
    long insertGlucoseIoThread(PocGlucose glucose);

    /**
     * 将所有的数据插入数据库
     *
     * @param glucose 数据
     */
    long[] insertGlucosesIoThread(PocGlucose... glucose);

    /**
     * 将所有的数据跟新数据库
     *
     * @param glucose 数据
     */
    int updateGlucosesIoThread(PocGlucose... glucose);

    //search

    /**
     * 获取指定发射器血糖数据
     *
     * @param deviceId 发射器Id
     * @return 所有的血糖数据
     */
    LiveData<List<PocGlucose>> getLiveDataGlucoseListByDeviceId(long deviceId);


    /**
     * 根据设备id获取数据
     *
     * @param deviceId 设备id
     */
    PocGlucose getLatestGlucoseByDeviceIdIoThread(long deviceId);

    /**
     * 根据设备id获取数据集
     *
     * @param deviceId 设备id
     * @return 数据集
     */
    List<PocGlucose> getGlucosesByIdIoThread(long deviceId);

    /**
     * 根据设备id获取有效的数据集 D > 0
     *
     * @param deviceId 设备id
     * @return 所有数据
     */
    List<PocGlucose> getEffectiveGlucosesByIdIoThread(long deviceId);


    /**
     * 根据设备id，数据id 获取数据
     *
     * @param deviceId  设备id
     * @param glucoseId 数据ID
     * @return 数据
     */
    PocGlucose getGlucoseByIdIoThread(long deviceId, int glucoseId);

    /**
     * 根据设备id，数据id 获取数据
     *
     * @param deviceId 设备id
     * @return 数据
     */
    PocGlucose getGlucoseByTimeIoThread(long deviceId, long timeMillis);

    /**
     * 根据设备Id获取最大的血糖id
     *
     * @param deviceId 设备ID
     * @return 最大的数据id
     */
    int getMaxGlucoseIdIoThread(long deviceId);

    /**
     * 根据设备id获取数据总数
     *
     * @param deviceId 设备ID
     * @return 总数
     */
    int getCountGlucoseIoThread(long deviceId);

    /**
     * 获取所有的Iw
     *
     * @param deviceId 发射器编号
     * @param Iw       当前的Iw
     * @return 返回所有Iw
     */
    float[] getIwsIoThread(long deviceId, float Iw);

    /**
     * 获取所有的Ib
     *
     * @param deviceId 发射器编号
     * @param Ib       当前的Ib
     * @return 返回所有Ib
     */
    float[] getIbsIoThread(long deviceId, float Ib);

    /**
     * 获取所有的温度
     *
     * @param deviceId 发射器编号
     * @param T        当前的温度
     * @return 返回所有温度
     */
    float[] getTsIoThread(long deviceId, float T);


    /**
     * 返回所有年分
     *
     * @param deviceId 发射器编号
     * @return 所有的年份(跨年数据)
     */
    int[] getYearsIoThread(long deviceId);

    /**
     * 返回当前年中所有的月份
     *
     * @param deviceId 发射器编号
     * @param year     当前年份
     * @return 当前年中所有的月份(跨月数据)
     */
    int[] getMonthsInYearIoThread(long deviceId, int year);

    /**
     * 返回当前年中当前月中所有的天
     *
     * @param deviceId 发射器编号
     * @param year     当前年
     * @param month    当前月
     * @return 所有的天
     */
    int[] getDays(long deviceId, int year, int month);

    /**
     * 获取每一天的数据
     *
     * @param deviceId 发射器编号
     * @param year     当前年
     * @param month    当前月
     * @param day
     * @return 所有的天
     */
    List<PocGlucose> getEveryDays(long deviceId, int year, int month, int day);

    /**
     * 获取时间间距里的所有数据
     *
     * @param deviceId 发射器编号， 起始时间，结束时间
     * @return 返回所有血糖数据
     */
    List<PocGlucose> getAllGlucoseByBetweenTime(long deviceId, Date startTime, Date endTime);

    /**
     * 获取分页的数据,page 从后往前数 ，第一页往往是最新的数据页
     *
     * @param deviceId 发射器编号
     * @param page     页码,比如说有4页，那就是 [4,3,2,1]
     * @param pageSize 该页的数据
     * @return 返回分页数据, 数据为倒序
     */
    List<PocGlucose> getEveryPageData(long deviceId, int page, int pageSize);

    /**
     * 获取最新的页面的分页数据,
     *
     * @param deviceId 发射器编号
     * @param pageSize 该页的数据
     * @return 返回分页数据, 数据为倒序
     */
    List<PocGlucose> getLatestPageData(long deviceId, int pageSize);


    /**
     * 获取最新的页面的分页数据,
     *
     * @param name 发射器名称 （可能会有两个编号）
     * @return 返回分页数据, 数据为倒序
     */
    List<PocGlucose> getAllGlucoseDayData(String name);


    /**
     * 获取分页数,将所有预热完成的点按照给定的分页数量进行分页,
     *
     * @param deviceId 发射器编号
     * @param pageSize 每一页的数据量
     * @return 获取数据可以分页总量
     */
    int getPageCountsIoThread(long deviceId, int pageSize);

    List<PocGlucose> getStartDayList(long deviceId, int year, int month, int day, int hour);

    List<PocGlucose> getEndDayList(long deviceId, int year, int month, int day, int hour);

    List<PocGlucose> getGlucoseByDeviceIdAndTimeMillis(long deviceId, long timeMillisStart);

    List<PocGlucose> getGlucosesByIdIoThreadDesc(long deviceId);

    List<PocGlucose> getGlucoseByTimeMillis(long startTime, long endTime);

}
