package com.persagy.server.services.base

import com.persagy.database.SAbstractDao
import com.persagy.database.SFilter
import com.persagy.database.extensions.keyValue
import com.persagy.mybatis.SMybatisDao
import com.persagy.server.Opt
import com.persagy.server.datacenter.models.entities.base.BaseInfo
import com.persagy.server.datacenter.models.entities.logs.DataCenterLogs
import com.persagy.server.jms.RabbitMqService
import com.persagy.server.services.assistant.SchemeService
import com.persagy.server.services.log.DataCenterLogsService
import com.persagy.server.services.rel.RSpInBdService
import com.persagy.server.services.rel.RSpInFlService
import com.persagy.server.synchronize.MessageHandler
import com.persagy.service.SObjectService
import com.persagy.service.SPageContext
import com.persagy.service.utils.SSpringContextUtil
import org.slf4j.LoggerFactory


/**
 * 服务基类
 *
 * @author 张维新
 */
open class Service<ENTITY : BaseInfo>(daoClass: SAbstractDao<ENTITY>) : SObjectService<ENTITY>(daoClass) {
    companion object {
        /** 日志 */
        private val logger = LoggerFactory.getLogger(Service::class.java)

        /** MQ消息对象 */
        val messageHandler by lazy {
            SSpringContextUtil.getBean(MessageHandler::class.java) as MessageHandler
        }

        /** 自定义sql */
        val schemeService by lazy {
            SSpringContextUtil.getBean(SchemeService::class.java) as SchemeService
        }

        /** RabbitMQ消息对象 */
        val rabbitMqService by lazy {
            SSpringContextUtil.getBean(RabbitMqService::class.java) as RabbitMqService
        }
    } // Companion object
    /** 日志 */
    var logService = SObjectService(SMybatisDao(DataCenterLogs::class.java))

    /**
     * 创建成功回调函数
     *
     * @param   entityList          创建成功对象
     */
    override fun onCreateSuccess(entityList: ArrayList<ENTITY>) {

        entityList.forEach {
            val projectId = SPageContext.getHeader("projectId")
            val coming = SPageContext.getHeader("coming")
            val account = SPageContext.getHeader("account")
            try {
                rabbitMqService.sendObjects(projectId!!, Opt.CREATE,it.keyValue("id").toString())
            } catch (e: Exception) {
                e.printStackTrace()
            }
            try {
                /** 日志 */
//                val dataCenterLogs = DataCenterLogs()
//                dataCenterLogs.id = IdUtils.uuidCreate()
//                dataCenterLogs.author = "dataCenter"
//                dataCenterLogs.projectId = projectId
//                dataCenterLogs.objectType = it.objectType
//                dataCenterLogs.type = "create"
//                dataCenterLogs.coming = comming
//                dataCenterLogs.account = account
//                dataCenterLogs.objectId = it.keyValue("id").toString()
//                val hashMap = HashMap<String, Any?>()
//                hashMap[it.objectType!!] = it
//                dataCenterLogs.dataSource = hashMap
//                logService.insert(dataCenterLogs)
                DataCenterLogsService.addLogs(projectId!!,"create",it.objectType!!,
                    it.keyValue("id").toString(),it,account,coming)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }

        return
    }

    /**
     * 删除成功回调函数
     *
     * @param   entityList      删除成功对象列表
     */
    override fun onDeleteSuccess(entityList: ArrayList<ENTITY>) {
        val projectId = SPageContext.getHeader("projectId")
        val coming = SPageContext.getHeader("coming")
        val account = SPageContext.getHeader("account")
        entityList.forEach {
            try {
                if (it.keyValue("id").toString().startsWith("Sp")){
                    /** 清除空间和建筑楼层的的数据 */
                    RSpInBdService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("spaceId",it.keyValue("id").toString()))
                    RSpInFlService.delete(SFilter.eq("projectId",projectId!!), SFilter.eq("spaceId",it.keyValue("id").toString()))
                }
            } catch (e: Exception) {
                e.printStackTrace()
            }

            try {
                rabbitMqService.sendObjects(projectId!!, Opt.DELETE,it.keyValue("id").toString())
            } catch (e: Exception) {
                e.printStackTrace()
            }
            try {
                DataCenterLogsService.addLogs(projectId!!,"delete",it.objectType!!,
                    it.keyValue("id").toString(),it,account,coming)
            } catch (e: Exception) {
            }
        }
        return
    } // Function onDeleteSuccess()


    override fun onUpdateBefore(entity: ENTITY): Boolean {

        try {
            val projectId = SPageContext.getHeader("projectId")
            val coming = SPageContext.getHeader("coming")
            val account = SPageContext.getHeader("account")
            /** 日志 */
//            val dataCenterLogs = DataCenterLogs()
//            dataCenterLogs.id = IdUtils.uuidCreate()
//            dataCenterLogs.author = "dataCenter"
//            dataCenterLogs.projectId = projectId
//            dataCenterLogs.objectType = entity.objectType
//            dataCenterLogs.type = "update-before"
//            dataCenterLogs.account = account
//            dataCenterLogs.coming = comming
//            dataCenterLogs.objectId = entity.keyValue("id").toString()
//            val hashMap = HashMap<String, Any?>()
//            hashMap[entity.objectType!!] = entity
//            dataCenterLogs.dataSource = hashMap
//            logService.insert(dataCenterLogs)
            DataCenterLogsService.addLogs(projectId!!,"update-before",entity.objectType!!,
                entity.keyValue("id").toString(),entity,account,coming)
        } catch (e: Exception) {
            e.printStackTrace()
    }

        return super.onUpdateBefore(entity)
    }

    /**
     * 更新成功能回调函数
     *
     * @param   entityList      更新成功对象列表
     */
    override fun onUpdateSuccess(entityList: ArrayList<ENTITY>) {
        try {
            val projectId = SPageContext.getHeader("projectId")
            val coming = SPageContext.getHeader("coming")
            val account = SPageContext.getHeader("account")
            for (entity in entityList) {
                rabbitMqService.sendObjects(projectId!!, Opt.UPDATE,entity.keyValue("id").toString())
                try {
                    /** 日志 */
//                    val dataCenterLogs = DataCenterLogs()
//                    dataCenterLogs.id = IdUtils.uuidCreate()
//                    dataCenterLogs.author = "dataCenter"
//                    dataCenterLogs.projectId = projectId
//                    dataCenterLogs.objectType = entity.objectType
//                    dataCenterLogs.type = "update-after"
//                    dataCenterLogs.account = account
//                    dataCenterLogs.coming = comming
//                    dataCenterLogs.objectId = entity.keyValue("id").toString()
//                    val hashMap = HashMap<String, Any?>()
//                    hashMap[entity.objectType!!] = entity
//                    dataCenterLogs.dataSource = hashMap
//                    logService.insert(dataCenterLogs)
                    DataCenterLogsService.addLogs(projectId!!,"update-after",entity.objectType!!,
                        entity.keyValue("id").toString(),entity,account,coming)
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return
    } // Function onUpdateSuccess()

} // Class Service
