//云端数据同步导本地
const EventEmitter = require('events')
const db = require('./db.js')
const env = require('./env.js')
const api = require('./api.js')
const logger = require('./logger.js')('sync.js')

class executor extends EventEmitter {

    async start() {
        try {
            db.init()

            let totalCount = await api.countStudents(env.examId)
            logger.info('student count: ' + totalCount)
            this.emit('total', totalCount)

            let promises = []
            let count = 0
            let pageNumber = 0
            this.emit('student', 0)
            while (true) {
                pageNumber++
                logger.info('student page=' + pageNumber)
                let array = await api.getStudents(env.examId, pageNumber, 100, {
                    withScoreDetail: true
                })
                if (array == undefined || array.length == 0) {
                    break
                }
                let datas = []
                for (var i = 0; i < array.length; i++) {
                    var obj = array[i]
                    var objList = []
                    var subList = []
                    if (obj.objectiveScoreDetail) {
                        obj.objectiveScoreDetail.forEach(detail => {
                            let score = Math.round(detail.score * 10 / 10)
                            objList.push(detail.answer + ':' + score)
                        })
                    }
                    if (obj.subjectiveScoreDetail) {
                        obj.subjectiveScoreDetail.forEach(detail => {
                            let score = Math.round(detail.score * 10 / 10)
                            subList.push(score)
                        })
                    }
                    datas.push([obj['id'], env.examId, obj['schoolId'], obj['examNumber'], obj['examNumber'], obj['name'], obj['studentCode'], obj['subjectCode'],
                        obj['subjectName'], obj['campusName'], obj['packageCode'], obj['batchCode'], obj['sheetCount'], obj['sliceCount'], obj['answers'],
                        obj['upload'] ? 1 : 0, obj['absent'] ? 1 : 0, obj['breach'] ? 1 : 0, obj['manualAbsent'] ? 1 : 0, obj['objectiveScore'].length > 0 ? obj['objectiveScore'] : 0,
                        obj['subjectiveScore'].length > 0 ? obj['subjectiveScore'] : 0, objList.join(';'), subList.join(';'), obj['subjectiveStatus'] || 'UNMARK',
                        obj['examSite'], obj['examRoom'], obj['remark'], obj['college'] || '', obj['className'] || '', obj['teacher'] || ''
                    ])
                }
                //console.log('get:' + array.length)
                promises.push(new Promise((resolve, reject) => {
                    db.batchQuery('replace into eb_exam_student(id, exam_id, school_id\
                        , exam_number, secret_number, name, student_code, subject_code, subject_name, campus_name\
                        , package_code, batch_code, sheet_count, slice_count, answers, is_upload\
                        , is_absent, is_manual_absent, is_breach, is_exception\
                        , objective_score, subjective_score, objective_score_list, subjective_score_list, subjective_status\
                        , exam_site, exam_room, remark, college, class_name, teacher) \
                        values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,0,?,?,?,?,?,?,?,?,?,?,?)',
                        datas).then(() => {
                        count += datas.length
                        this.emit('student', count)
                        resolve()
                    }).catch((err) => {
                        reject(err)
                    })
                }))
            }

            //get and save package
            this.emit('package', 0)
            let packages = await api.getPackages(env.examId)
            let packageData = []
            for (let i = 0; i < packages.length; i++) {
                let obj = packages[i]
                packageData.push([env.examId, obj['code'], obj['picCount']])
            }
            logger.info('package count:' + packageData.length)
            promises.push(new Promise((resolve, reject) => {
                db.batchQuery('replace into eb_exam_package(exam_id, code, pic_count) values (?,?,?)', packageData).then(() => {
                    this.emit('package', packageData.length)
                    resolve()
                }).catch((err) => {
                    reject(err)
                })
            }))

            await Promise.all(promises)
            this.emit('finish')
        } catch (err) {
            this.emit('error', err)
            logger.error(err)
        } finally {
            //console.log(moment().format('YYYY-MM-DD HH:mm:ss'))
        }
    }
}

module.exports = function () {
    return new executor()
}