'use strict';

const moment = require('moment')

module.exports = function (app, opts) {
   async function token4yingshi ({ key, secret, token, expire } = {}) {
      const { models } = app.fs.dc
      if (!key || !secret) {
         throw '参数 { key, secret } 缺一不可'
      }

      if (token && expire && moment().isBefore(moment(expire))) {
         return token
      } else {
         const secretRes = await models.SecretYingshi.findOne({
            where: { key, secret }
         })
         if (secretRes && secretRes.expire && secretRes.token && moment().isBefore(moment(secretRes.expire))) {
            return secretRes.token
         }
      }

      // 也可以做基于 redis 的缓存
      const tokenRes = await app.fs.yingshiRequest.post(`lapp/token/get`, {
         query: {
            appKey: key,
            appSecret: secret
         }
      })
      if (tokenRes.code == 200 && tokenRes.data) {
         const { accessToken, expireTime } = tokenRes.data
         await models.SecretYingshi.update({
            token: accessToken,
            expire: expireTime
         }, {
            where: {
               key, secret
            }
         })
         return accessToken
      } else {
         throw {
            msg: '未能获取萤石token',
            key, secret,
            tokenRes
         }
      }
   }

   async function varifyYingshiBelongSecretBySerialNo (serialNo) {
      const { models } = app.fs.dc
      const serialNo_ = String(serialNo).toUpperCase()
      const secretRes = await models.SecretYingshi.findAll()
      let beloneSecret = null
      for (let s of secretRes) {
         const tokenYingshi = await token4yingshi(s.dataValues)
         // 检测设备所属
         const cameraState = await app.fs.yingshiRequest.post('lapp/device/info', {
            query: {
               accessToken: tokenYingshi,
               deviceSerial: serialNo_
            }
         })
         if (cameraState.code == 200) {
            beloneSecret = {
               ...s.dataValues,
               token: tokenYingshi
            }
            break
         }
      }
      return beloneSecret
   }

   const getYingshiPlayUrl = async ({ deviceSerial, token }) => {
      const protocolMap = {
         ezopen: 1,
         hls: 2,
         rtmp: 3,
         flv: 4,
      }
      const qualityMap = {
         hd: 1,
         sd: 2,
      }
      const typeMap = {
         // live: 1,
         local: 2,
         cloud: 3
      }

      let playUrl = {
         liveUrl: {// 直播
            hd: {// 高清
               rtmp: '',
               hls: '',
               flv: '',
               ezopen: '',
            },
            sd: {// 标清
               rtmp: '',
               hls: '',
               flv: '',
               ezopen: '',
            }
         },
         replayUrl: {// 回放
            cloud: '',
            local: '',
         }
      }

      for (let protocol in protocolMap) {
         for (let quality in qualityMap) {
            const playUrlRes = await app.fs.yingshiRequest.post('lapp/v2/live/address/get', {
               query: {
                  accessToken: token,
                  deviceSerial: deviceSerial,
                  protocol: protocolMap[protocol],
                  quality: qualityMap[quality],
               }
            })
            if (playUrlRes.code == 200) {
               playUrl.liveUrl[quality][protocol] = playUrlRes.data.url
            } else {
               // return null
            }
         }
      }

      for (let type in typeMap) {
         try {
            const playUrlRes = await app.fs.yingshiRequest.post('lapp/v2/live/address/get', {
               query: {
                  accessToken: token,
                  deviceSerial: deviceSerial,
                  type: typeMap[type],
               }
            })
            if (playUrlRes.code == 200) {
               playUrl.replayUrl[type] = playUrlRes.data.url
            } else {
               // return null
            }
         } catch (error) {
            app.fs.logger.error(`sechedule: freshYingshiPlayUrl, error: ${error}`);
         }
      }

      return playUrl
   }

   return {
      token4yingshi,
      varifyYingshiBelongSecretBySerialNo,
      getYingshiPlayUrl,
   }
}