package com.persagy.labsl.services

import com.persagy.database.SFilter
import com.persagy.labsl.models.entities.tpt.Node
import com.persagy.mybatis.SMybatisDao
import com.persagy.service.SObjectService
import com.persagy.service.models.enums.SResponseType
import com.persagy.service.models.requests.SCreateRequest
import com.persagy.service.models.responses.SBaseResponse
import com.persagy.service.models.responses.SCreateResponse
import org.springframework.web.bind.annotation.RequestBody
import java.util.*

/**
 * 图例节点服务
 *
 * @author wx  <zhangweixin@sagacloud.com>
 */
object NodeService : SObjectService<Node>(SMybatisDao(
    Node::class.java)) {
    /**
     * 创建之前
     *
     * @param entity    图例节点
     * @return 是否处理
     */
    override fun onCreateBefore(entity: Node): Boolean {
        /** id 赋值 */
        entity.id = UUID.randomUUID().toString().replace("-", "")
        return super.onCreateBefore(entity)
    }

    /**
     * 创建设备节点
     *
     * @param request   创建设备节点对象列表
     * @return 返回结果
     */
    fun creates(request: SCreateRequest<Node>): SCreateResponse<Node> {
        /** 返回结果对象 */
        val sCreateResponse = SCreateResponse<Node>()
        /** 返回结果中的状态 */
        sCreateResponse.result = SResponseType.failure
        return try {
            /** 列表不可以为空 */
            if (!request.content.isNullOrEmpty()) {
                /** 遍历标记列表 */
                for (node in request.content) {
                    /** 判断必传字段不可以为空 */
                    if (node.id.isNullOrEmpty() || node.graphId.isNullOrEmpty() || node.name.isNullOrEmpty()) {
                        sCreateResponse.message = "注意必填字段不可以为空如 id、graphId、name"
                        return sCreateResponse
                    }
                    /** 查询 id 和 graphId 是否存在，是否可以定位一个系统图 */
                    val graphList =
                        GraphService.select(SFilter.eq("id", node.id!!), SFilter.eq("graphId", node.graphId!!))
                            .exec()
                    /** 图 id 和 graphId 不存在*/
                    if (graphList.size == 0) {
                        sCreateResponse.message = "请检查 id 和 graphId 是否为已有系统图中的 id"
                        return sCreateResponse
                    }
                }

                /** 遍历标记列表 */
                for (node in request.content) {
                    /** 判断标记id是否没有，为空赋值 */
                    if (node.nodeId.isNullOrEmpty()) {
                        node.nodeId = UUID.randomUUID().toString().replace("-", "")
                    }

                    /** 插入数据 */
                   insert(node)
                }
                /** 对象列表 */
                sCreateResponse.entityList = request.content
                /** 标志 */
                sCreateResponse.result = SResponseType.success
                /** 对象 */
                sCreateResponse
            } else {
                /** 描述 */
                sCreateResponse.message = "不可以传空列表"
                /** 对象 */
                return sCreateResponse
            }
        } catch (e: Exception) {
            e.printStackTrace()
            sCreateResponse.message = e.message!!
            sCreateResponse
        }
    }

    /**
     * 批量删除设备节点
     *
     * @param idList    设备节点对象列表
     * @return 返回结果
     */
    fun deletes(@RequestBody idList: ArrayList<Node>): SBaseResponse {
        /** 返回结果对象 */
        val sBaseResponse = SBaseResponse()
        /** 返回结果状态 */
        sBaseResponse.result = SResponseType.failure
        return try {
            /** 列表不可以为空 */
            if (!idList.isNullOrEmpty()) {
                /** 遍历设备节点列表 */
                for (node in idList) {
                    /** 校验必填信息点 */
                    if (node.id.isNullOrEmpty() || node.nodeId.isNullOrEmpty()) {
                        sBaseResponse.message = "注意接口说明必填字段"
                        return sBaseResponse
                    }
                }

                /** 遍历设备节点列表 */
                for (node in idList) {
                    /** 删除对象 */
                    delete(SFilter.eq("id", node.id!!), SFilter.eq("nodeId", node.nodeId!!))
                }

                /** 返回结果状态 */
                sBaseResponse.result = SResponseType.success
            }
            /** 返回结果对象 */
            sBaseResponse
        } catch (e: Exception) {
            e.printStackTrace()
            /** 返回结果，状态、以及报错信息 */
            SBaseResponse(SResponseType.failure,e.message!!)
        }
    }


}