package hcnetsdk.sdkhub;

import android.util.Log;
import android.view.Surface;
import android.view.SurfaceHolder;

import com.hikvision.netsdk.HCNetSDK;
import com.hikvision.netsdk.NET_DVR_FILECOND;
import com.hikvision.netsdk.NET_DVR_FINDDATA_V30;
import com.hikvision.netsdk.NET_DVR_PLAYBACK_INFO;
import com.hikvision.netsdk.NET_DVR_PLAYCOND;
import com.hikvision.netsdk.NET_DVR_TIME;
import com.hikvision.netsdk.NET_DVR_VOD_PARA;
import com.hikvision.netsdk.PlaybackControlCommand;

import java.util.Calendar;

/**
 * brief：device guider
 * author：hubinglun
 * date：2019/05/13
 */

public class DevPlayBackGuider {
    //Time Conversion Interface
    public boolean ConvertToTime(NET_DVR_TIME time, Calendar cal) {
        if (time == null || cal == null) {
            return false;
        }
        time.dwYear = cal.get(Calendar.YEAR);
        time.dwMonth = cal.get(Calendar.MONTH) + 1;
        time.dwDay = cal.get(Calendar.DAY_OF_MONTH);
        time.dwHour = cal.get(Calendar.HOUR_OF_DAY);
        time.dwMinute = cal.get(Calendar.MINUTE);
        time.dwSecond = cal.get(Calendar.SECOND);
        return true;
    }

    //Playback control interface
    public boolean PlayBackControl_V40_jni(int lPlayHandle, int dwControlCode, byte[] lpInBuffer, int dwInLen, NET_DVR_PLAYBACK_INFO lpOutBuffer) {
        if (lPlayHandle < 0) {
            Log.e("Casic", "PlayBackControl_V40_jni failed with error param");
            return false;
        }
        return HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(lPlayHandle, dwControlCode, lpInBuffer, dwInLen, lpOutBuffer);
    }

    //Playback by filename
    public int PlayBackByName_jni(int iLogID, String strFileName, Surface surface) {
        if (iLogID < 0 || strFileName.isEmpty() || surface == null) {
            Log.e("Casic", "PlayBackByName_jni failed with error param");
            return -1;
        }
        int iPlaybackID = HCNetSDK.getInstance().NET_DVR_PlayBackByName(iLogID, strFileName, surface);

        if (iPlaybackID < 0) {
            Log.e("Casic", "NET_DVR_PlayBackByName is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            return -1;
        }

        if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(iPlaybackID, PlaybackControlCommand.NET_DVR_PLAYSTART, null, 0, null)) {
            Log.e("Casic", "NET_DVR_PlayBackControl_V40 is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            HCNetSDK.getInstance().NET_DVR_StopPlayBack(iPlaybackID);
            return -1;
        }

        return iPlaybackID;
    }

    //Find the files
    public int FindFile_V30_jni(int iUserID, NET_DVR_FILECOND lpSearchInfo) {
        if (iUserID < 0 || lpSearchInfo == null) {
            Log.e("Casic", "FindFile_V30_jni failed with error param");
            return -1;
        }
        return HCNetSDK.getInstance().NET_DVR_FindFile_V30(iUserID, lpSearchInfo);
    }

    public int FindNextFile_V30_jni(int iFindHandle, NET_DVR_FINDDATA_V30 struFindData) {
        if (iFindHandle < 0 || struFindData == null) {
            Log.e("Casic", "FindNextFile_V30_jni failed with error param");
            return -1;
        }
        return HCNetSDK.getInstance().NET_DVR_FindNextFile_V30(iFindHandle, struFindData);
    }

    public boolean FindClose_V30_jni(int iFindHandle) {
        if (iFindHandle < 0) {
            Log.e("Casic", "FindClose_V30_jni failed with error param");
            return false;
        }
        return HCNetSDK.getInstance().NET_DVR_FindClose_V30(iFindHandle);
    }

    public int PlayBackSurfaceChanged_jni(int iHandle, int nRegionNum, SurfaceHolder hHwnd) {
        if (iHandle < 0 || nRegionNum < 0) {
            Log.e("Casic", "PlayBackSurfaceChanged_jni failed with error param");
            return -1;
        }
        return HCNetSDK.getInstance().NET_DVR_PlayBackSurfaceChanged(iHandle, nRegionNum, hHwnd);
    }

    public boolean StopPlayBack_jni(int iPlaybackID) {
        if (iPlaybackID < 0) {
            Log.e("Casic", "StopPlayBack_jni failed with error param");
            return false;
        }
        return HCNetSDK.getInstance().NET_DVR_StopPlayBack(iPlaybackID);
    }

    // Download by File Name
    public int GetFileByName_jni(int iLogID, String strFileName, String strPath) {
        if (iLogID < 0 || strFileName.isEmpty() || strPath.isEmpty()) {
            Log.e("Casic", "GetFileByName_jni failed with error param");
            return -1;
        }

        int iDownloadID = HCNetSDK.getInstance().NET_DVR_GetFileByName(iLogID, strFileName, strPath);

        if (iDownloadID < 0) {
            Log.e("Casic", "NET_DVR_GetFileByName is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            return -1;
        }

        byte[] byTranstype = new byte[60];
        byTranstype[0] = 5;

        if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(iDownloadID, PlaybackControlCommand.NET_DVR_SET_TRANS_TYPE, byTranstype, 4, null)) {
            Log.e("Casic", "NET_DVR_PlayBackControl_V40  NET_DVR_SET_TRANS_TYPE is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            HCNetSDK.getInstance().NET_DVR_StopGetFile(iDownloadID);
            return -1;
        }

        if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(iDownloadID, PlaybackControlCommand.NET_DVR_PLAYSTART, null, 0, null)) {
            Log.e("Casic", "NET_DVR_PlayBackControl_V40  NET_DVR_PLAYSTART is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            HCNetSDK.getInstance().NET_DVR_StopGetFile(iDownloadID);
            return -1;
        }
        return iDownloadID;
    }


    //Reverse by filename
    public int PlayBackReverseByName_jni(int iLogID, String strFileName, Surface surface) {
        if (iLogID < 0 || surface == null || strFileName.isEmpty()) {
            Log.e("Casic", "PlayBackReverseByName_jni failed with error param");
            return -1;
        }
        int iPlaybackID = HCNetSDK.getInstance().NET_DVR_PlayBackReverseByName(iLogID, strFileName, surface);

        if (iPlaybackID < 0) {
            Log.e("Casic", "NET_DVR_PlayBackReverseByName is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            return -1;
        }

        if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(iPlaybackID, PlaybackControlCommand.NET_DVR_PLAYSTART, null, 0, null)) {
            Log.e("Casic", "NET_DVR_PlayBackControl_V40 is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            HCNetSDK.getInstance().NET_DVR_StopPlayBack(iPlaybackID);
            return -1;
        }
        return iPlaybackID;
    }


    //Playback JNI interface by time
    public int GetFileByTime_jni(int iUserID, int iChannel, NET_DVR_TIME timeStart, NET_DVR_TIME timeStop, String fileName) {

        if (iUserID < 0 || iChannel < 0 || timeStart == null || timeStop == null || fileName.isEmpty()) {
            Log.e("Casic", "GetFileByTime_jni failed with error param");
            return -1;
        }

        int iDownloadID = HCNetSDK.getInstance().NET_DVR_GetFileByTime(iUserID, iChannel, timeStart, timeStop, fileName);

        if (iDownloadID < 0) {
            Log.e("Casic", "NET_DVR_GetFileByTime is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            return -1;
        }

        if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(iDownloadID, PlaybackControlCommand.NET_DVR_PLAYSTART, null, 0, null)) {
            Log.e("Casic", "NET_DVR_PlayBackControl_V40 is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            HCNetSDK.getInstance().NET_DVR_StopGetFile(iDownloadID);
            return -1;
        }
        return iDownloadID;
    }

    //Get playback progress
    public int GetPlayBackPos_jni(int iPlaybackID) {
        return HCNetSDK.getInstance().NET_DVR_GetPlayBackPos(iPlaybackID);
    }

    //Get the progress of downloading videos
    public int GetDownloadPos_jni(int iDownloadID) {
        if (iDownloadID < 0) {
            Log.e("Casic", "GetDownloadPos_jni failed with error param");
            return -1;
        }
        return HCNetSDK.getInstance().NET_DVR_GetDownloadPos(iDownloadID);
    }

    //停止下载录像文件
    public boolean StopGetFile_jni(int iDownloadID) {
        if (iDownloadID < 0) {
            Log.e("Casic", "StopGetFile_jni failed with error param");
            return false;
        }
        return HCNetSDK.getInstance().NET_DVR_StopGetFile(iDownloadID);
    }

    //Playback on time
    public int PlayBackByTime_v40_jni(int iLogID, NET_DVR_VOD_PARA vodParma) {
        if (iLogID < 0 || vodParma == null) {
            Log.e("Casic", "PlayBackByTime_v40_jni failed with error param");
            return -1;
        }

        int iPlaybackID = HCNetSDK.getInstance().NET_DVR_PlayBackByTime_V40(iLogID, vodParma);
        if (iPlaybackID < 0) {
            Log.e("Casic", "NET_DVR_PlayBackByTime_V40 is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            return -1;
        }

        if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(iPlaybackID, PlaybackControlCommand.NET_DVR_PLAYSTART, null, 0, null)) {
            Log.e("Casic", "NET_DVR_PlayBackControl_V40 is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            HCNetSDK.getInstance().NET_DVR_StopPlayBack(iPlaybackID);
            return -1;
        }

        if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(iPlaybackID, PlaybackControlCommand.NET_DVR_PLAYSTARTAUDIO, null, 0, null)) {
            Log.e("Casic", "NET_DVR_PlayBackControl_V40 is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            HCNetSDK.getInstance().NET_DVR_StopPlayBack(iPlaybackID);
            return -1;
        }
        return iPlaybackID;
    }

    //Time reversal
    public int PlayBackReverseByTime_V40_jni(int iLogID, Surface surface, NET_DVR_PLAYCOND vodcond) {
        if (iLogID < 0 || vodcond == null || surface == null) {
            Log.e("Casic", "PlayBackReverseByTime_V40_jni failed with error param");
            return -1;
        }

        int iPlaybackID = HCNetSDK.getInstance().NET_DVR_PlayBackReverseByTime_V40(iLogID, surface, vodcond);
        if (iPlaybackID < 0) {
            Log.e("Casic", "NET_DVR_PlayBackReverseByTime_V40 is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            return -1;
        }

        if (!HCNetSDK.getInstance().NET_DVR_PlayBackControl_V40(iPlaybackID, PlaybackControlCommand.NET_DVR_PLAYSTART, null, 0, null)) {
            Log.e("Casic", "NET_DVR_PlayBackControl_V40 is failed!Err:" + MessageCodeHub.INSTANCE.getErrorCode());
            HCNetSDK.getInstance().NET_DVR_StopPlayBack(iPlaybackID);
            return -1;
        }
        return iPlaybackID;
    }

}
