const schedule = require('node-schedule');
const moment = require('moment')

module.exports = function (app, opts) {
   const freshYingshiState = schedule.scheduleJob(
      // '* * 4 * * *',
      '*/10 * * * *',
      async () => {
         try {
            const startTime = moment()
            const { models } = app.fs.dc
            const { token4yingshi, getYingshiPlayUrl } = app.fs.utils
            const secretRes = await models.SecretYingshi.findAll()
            let deviceList = []
            for (let s of secretRes) {
               const tokenYingshi = await token4yingshi(s.dataValues)
               // 查询所有设备
               let pageStart = 0
               while (pageStart >= 0) {
                  const deviceRes = await app.fs.yingshiRequest.post('lapp/device/list', {
                     query: {
                        accessToken: tokenYingshi,
                        pageStart,
                        pageSize: 50
                     }
                  })
                  if (deviceRes.code == 200) {

                     deviceList = deviceList.concat.apply(deviceList, deviceRes.data)
                     for (let d of deviceRes.data) {
                        const existD = await models.GbCamera.findOne({
                           where: {
                              streamid: d.deviceSerial
                           }
                        })

                        let storageD = {
                           level: 0,
                           ipctype: 'yingshi',
                           streamid: d.deviceSerial,
                           online: d.status ? 'ON' : 'OFF',
                           name: d.deviceName,
                        }
                        if (existD) {
                           if (existD.online != storageD.online) {
                              // 状态更新
                              if (storageD.online == 'ON' && !existD.playUrl) {
                                 const playUrlRes = await getYingshiPlayUrl({ deviceSerial: d.deviceSerial, token: tokenYingshi })
                                 storageD.playUrl = playUrlRes
                              }
                              await models.GbCamera.update(storageD, {
                                 where: {
                                    id: existD.id
                                 }
                              })

                              // 状态推送
                              const { connected } = app.socket.sockets
                              const roomId = 'ROOM_' + Math.random() + '_' + d.deviceSerial
                              let cameraName = ''
                              if (connected) {
                                 for (let c in connected) {
                                    const { client: { conn: { request: { _query } } } } = connected[c]
                                    if (_query && _query.token) {
                                       let userInfo = await app.redis.hget(_query.token, 'userInfo');
                                       if (userInfo) {
                                          userInfo = JSON.parse(userInfo)
                                          const corCameraRes = await models.Camera.findOne({
                                             where: {
                                                gbId: existD.id,
                                                createUserId: userInfo.id
                                             }
                                          })
                                          // TODO 管理员判断
                                          if (corCameraRes) {
                                             cameraName = corCameraRes.name
                                             connected[c].join(roomId)
                                          }
                                       }
                                    }
                                 }

                                 app.socket.to(roomId).emit('CAMERA_ONLINE', {
                                    ipctype: 'yingshi',
                                    online: storageD.online,
                                    gbId: existD.id,
                                    name: cameraName
                                 })
                              }
                           }
                        } else {
                           const yingshiRes = await models.GbCamera.create(storageD)
                           await models.Camera.update({
                              gbId: yingshiRes.id
                           }, {
                              where: {
                                 serialNo: d.deviceSerial
                              }
                           })
                        }
                     }

                     if (deviceRes.data.length == 50) {
                        pageStart++
                     } else {
                        pageStart = -1
                     }
                  }
               }
            }
            // console.log(deviceList);
            console.info(`萤石设备 ${deviceList.length} 状态查询用时 ${moment().diff(startTime, 'seconds')} s`)
         } catch (error) {
            app.fs.logger.error(`sechedule: freshYingshiState, error: ${error}`);
         }
      });

   const freshYingshiPlayUrl = schedule.scheduleJob(
      // '0 0 4 */1 *',
      '*/45 * * * *',
      async () => {
         const protocolMap = {

         }
         try {
            const { models } = app.fs.dc
            const { token4yingshi, getYingshiPlayUrl } = app.fs.utils
            const secretRes = await models.SecretYingshi.findAll()
            for (let s of secretRes) {
               const tokenYingshi = await token4yingshi(s.dataValues)
               // 查询所有设备
               let pageStart = 0
               while (pageStart >= 0) {
                  const deviceRes = await app.fs.yingshiRequest.post('lapp/device/list', {
                     query: {
                        accessToken: tokenYingshi,
                        pageStart,
                        pageSize: 50
                     }
                  })
                  if (deviceRes.code == 200) {
                     for (let d of deviceRes.data) {
                        const playUrlRes = await getYingshiPlayUrl({ deviceSerial: d.deviceSerial, token: tokenYingshi })
                        await models.GbCamera.update({
                           playUrl: playUrlRes,
                        }, {
                           where: {
                              streamid: d.deviceSerial
                           }
                        })
                     }

                     if (deviceRes.data.length == 50) {
                        pageStart++
                     } else {
                        pageStart = -1
                     }
                  }
               }
            }
         } catch (error) {
            app.fs.logger.error(`sechedule: freshYingshiPlayUrl, error: ${error}`);
         }
      }
   )
   return {
      freshYingshiState,
      freshYingshiPlayUrl
   }
}