# -*- coding: utf-8 -*-

from website import errors
from website.handler import APIHandler, authenticated
from website.db.enterprise_entity import enterprise_entity as DB_Entity
from website.db.enterprise_node import enterprise_node as DB_Node
from website.db.enterprise_busi_model import enterprise_busi_model as DB_BusiModel
from website.db.enterprise_busi_model import enterprise_busi_model_node_device as DB_BusiModelNodeDevice
from website.db.enterprise_device import enterprise_device as DB_Device
from website.util import shortuuid


class AddHandler(APIHandler):
    """
    - 描述:添加企业节点
    - 请求方式:post
    - 请求参数:
    >- entity_suid, int, 企业id, short uuid
    >- name, string, 名称
    >- parent, int, 上级节点id
    >- addr, string, 地址
    >- lola, string, 经纬度,longitude and latitude
    >- contact, string, 负责人
    >- phone, string, 联系方式
    >- comment, string, 简介
    - 返回值:无
    """

    # @authenticated
    def post(self):
        entity_id = self.get_int_argument("entity_suid")
        entity_suid = self.get_escaped_argument("entity_suid", "")
        name = self.get_escaped_argument("name", "")
        parent = self.get_int_argument("parent", 0)
        addr = self.get_escaped_argument("addr", "")
        lola = self.get_escaped_argument("lola", "")
        contact = self.get_escaped_argument("contact", "")
        phone = self.get_escaped_argument("phone", "")
        comment = self.get_escaped_argument("comment", "")

        if not entity_id or not name:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误")

        db_entity = DB_Entity.EnterpriseEntityRepository()
        entity_suid = db_entity.get_entity_suid(entity_id)

        db_node = DB_Node.EnterpriseNodeRepository()
        db_node.insert_node({
            "suid": shortuuid.ShortUUID().random(length=10),
            "entity_id": entity_id,
            "entity_suid": entity_suid,
            "name": name,
            "parent": parent,
            "addr": addr,
            "lola": lola,
            "contact": contact,
            "phone": phone,
            "comment": comment
        })

        self.finish()


class EditHandler(APIHandler):
    """
    - 描述:更新企业节点
    - 请求方式:post
    - 请求参数:
    >- node_id, int, 节点id
    >- name, string, 名称
    >- parent, int, 上级节点id
    >- addr, string, 地址
    >- lola, string, 经纬度,longitude and latitude
    >- contact, string, 负责人
    >- phone, string, 联系方式
    >- comment, string, 简介
    - 返回值:无
    """

    # @authenticated
    def post(self):
        node_id = self.get_int_argument("node_id", 0)
        name = self.get_escaped_argument("name", "")
        parent = self.get_int_argument("parent", 0)
        addr = self.get_escaped_argument("addr", "")
        lola = self.get_escaped_argument("lola", "")
        contact = self.get_escaped_argument("contact", "")
        phone = self.get_escaped_argument("phone", "")
        comment = self.get_escaped_argument("comment", "")

        if not node_id or not name:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误")

        db_node = DB_Node.EnterpriseNodeRepository()
        db_node.update_node({
            "node_id": node_id,
            "name": name,
            "parent": parent,
            "addr": addr,
            "lola": lola,
            "contact": contact,
            "phone": phone,
            "comment": comment
        })

        self.finish()


class TreeHandler(APIHandler):
    """
    - 描述:企业节点树
    - 请求方式:post
    - 请求参数:
    >- entity_id, int, 企业id
    >- name, string, 搜索内容
    - 返回值:
    ```
    {	
        "data":[
            {
                "id": 123,
                "name": "xxx",
                "children": [
                    {
                        "id": 123,
                        "name": "xxx"
                        "children": [
                            {
                                "id": 123,
                                "name": "xxx"
                            },
                            
                        ]
                    },
                    ...
                ]
            },
            ...
        ]
        
    }
    ```
    """

    @authenticated
    def post(self):
        entity_id = self.get_escaped_argument("entity_id", "")
        name = self.get_escaped_argument("name", "")
        if not entity_id:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误")

        db_node = DB_Node.EnterpriseNodeRepository()
        nodes = db_node.select_tree(entity_id, name)
        self.finish({
            "data": nodes
        })


class InfoHandler(APIHandler):
    """
    - 描述:企业节点信息
    - 请求方式:post
    - 请求参数:
    >- node_id, int, 节点id
    - 返回值:
    ```
        {
            "name": "xxx",
            "parent": "xxx",
            "addr": "xxx",
            "lola": "xxx",
            "contact": "xxx",
            "phone": "xxx",
            "comment": "xxx",
        }
    ```
    """

    @authenticated
    def post(self):
        node_id = self.get_int_argument("node_id")

        if not node_id:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误")

        db_node = DB_Node.EnterpriseNodeRepository()
        node = db_node.select_node(node_id)
        node = node and node or {}
        self.finish(node)


class DeleteHandler(APIHandler):

    @authenticated
    def post(self):
        node_id = self.get_int_argument("node_id")
        if not node_id:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误")
        db_node = DB_Node.EnterpriseNodeRepository()
        db_node.delete_node(node_id)
        self.finish()


class BusimodelHandler(APIHandler):
    """
    - 描述:企业节点,业务模型部署
    - 请求方式:post
    - 请求参数:
    > - pageNo
    > - pageSize
    > - node_id, int, 节点id
    - 返回值:
    ```
        {
            "count": 123,
            "data": [
                {
                    "busi_model_id": 123,   # 业务模型id
                    "busi_model_name": "xxx", # 业务模型name
                    "deployed": 0,            # 是否部署
                    "create_time": "xxx"      # 创建时间
                },
                ...
            ]
        }
    ```
    """
    @authenticated
    def post(self):
        node_id = self.get_int_argument('node_id')
        pageNo = self.get_int_argument('pageNo', 1)
        pageSize = self.get_int_argument('pageSize', 20)
        if not node_id:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不能为空')
        db_node = DB_Node.EnterpriseNodeRepository()
        busi_models = db_node.select_busi_model(node_id, pageNo, pageSize)
        self.finish({
            'data': busi_models,
            'count': len(busi_models)
            })


class BusimodelInfoHandler(APIHandler):
    """
    """
    @authenticated
    def post(self):
        self.finish()


class BusimodelDeployHandler(APIHandler):
    """
    - 描述:企业节点,节点信息 -> 业务模型部署 -> 业务模型配置
    - 请求方式:post
    - 请求参数:
    > - node_id, int, 节点id
    > - busi_model_id, int,业务模型id
    > - device_ids, string, 设备id, 多个id逗号分割
    - 返回值:无
    """
    @authenticated
    def post(self):
        node_id = self.get_int_argument('node_id')
        busi_model_id = self.get_int_argument('busi_model_id')
        device_ids = self.get_escaped_argument('device_ids', '')
        if not node_id or not busi_model_id:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '参数错误')
        db_node = DB_Node.EnterpriseNodeRepository()
        node = db_node.get_node_by_id(node_id)
        if not node:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '节点不存在')
        node_suid = node["suid"]

        db_busi_model = DB_BusiModel.EnterpriseBusiModelRepository()
        busi_model = db_busi_model.get_busi_model_by_id(busi_model_id)
        busi_model_suid = busi_model.suid

        entity_suid_row = db_node.get_entity_suid_by_node_id(node_id)
        if not entity_suid_row:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不存在')
        
        records = []


        records = []
        for device_id in device_ids.split(','):
            device = DB_Device.EnterpriseDeviceRepository().get_device(int(device_id))
            if not device:
                raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '设备不存在')
                
            records.append({
                "suid": shortuuid.ShortUUID.random(length=10),
                "entity_suid": entity_suid_row["entity_suid"],
                "node_id": node_id,
                "node_suid": node_suid,
                "busi_model_id": busi_model_id,
                "busi_model_suid": busi_model_suid,
                "device_id": int(device_id),
                "device_suid": device["suid"]
            })
        DB_BusiModelNodeDevice.EnterpriseBusiModelNodeDeviceRepository().batch_insert_record(records)
        
        self.finish()