# -*- coding: utf-8 -*-
import logging
from sqlalchemy import text

from website import db_mysql, errors
from website.handler import APIHandler, authenticated
from website.util import shortuuid
from website.db.enterprise_device import enterprise_device as DB_Device


class DeviceClassificationAddHandler(APIHandler):
    """
    - 描述:添加设备分类
    - 请求方式:post
    - 请求参数:
    >- entity_id, int, 企业id
    >- name, string, 设备分类名称
    - 返回值:
    ```
        {
            "id": 123
        }
    ```
    """

    @authenticated
    def post(self):
        name = self.get_escaped_argument("name", "")
        with self.app_mysql.connect() as conn:
            cur = conn.execute(
                text("SELECT id FROM device_classification WHERE name=:name"),
                {"name": name},
            )
            row = cur.fetchone()

            if row:
                raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备分类已存在")

            conn.execute(
                text(
                    "INSERT INTO device_classification (name, suid) VALUES (:name, :suid)"
                ),
                {"name": name, "suid": shortuuid.ShortUUID().random(10)},
            )
            conn.commit()
        self.finish()


class DeviceClassificationHandler(APIHandler):
    """
    - 描述:设备分类列表
    - 请求方式:post
    - 请求参数:
    >- 无
    - 返回值:
    ```
        {
            "data": [
                {
                    "id": 123,
                    "suid": "xxx",
                    "name": "xxx"
                },
                ...
            ]
        }
    ```
    """

    @authenticated
    def post(self):
        with self.app_mysql.connect() as conn:
            cur = conn.execute(
                text(
                    "SELECT id, suid, name FROM device_classification where del=0 ORDER BY id DESC"
                )
            )
            res = db_mysql.to_json_list(cur)
            res = res and res or []

        self.finish({"data": res})


class DeviceClassificationDeleteHandler(APIHandler):
    """
    - 描述:删除设备分类
    - 请求方式:post
    - 请求参数:
    >- id
    - 返回值:无
    """

    @authenticated
    def post(self):
        did = self.get_int_argument("id")
        with self.app_mysql.connect() as conn:
            conn.execute(
                text("update device_classification set del=1 WHERE id=:id"), {"id": did}
            )
            conn.commit()
        self.finish()


class DeviceAddHandler(APIHandler):
    """
    - 描述:企业节点,添加设备
    - 请求方式:post
    - 请求参数:
    >- entity_id, int, 企业id
    >- node_id, int
    >- name, string, 设备名称
    >- addr, string, 设备位置
    >- classification, string, 设备分类
    >- device_model, string, 设备型号
    >- param, string, 设备参数
    >- comment, string, 备注
    - 返回值:
    ```
        无
    ```
    """

    @authenticated
    def post(self):
        entity_id = self.get_int_argument("entity_id")
        node_id = self.get_int_argument("node_id")
        name = self.get_escaped_argument("name", "")
        addr = self.get_escaped_argument("addr", "")
        classification = self.get_escaped_argument("classification", "")
        device_model = self.get_escaped_argument("device_model", "")
        param = self.get_escaped_argument("param", "")
        comment = self.get_escaped_argument("comment", "")

        if not name:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备名称不能为空")
        if not entity_id or not node_id:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "企业节点不能为空")

        device_data = {
            "entity_id": entity_id,
            "node_id": node_id,
            "name": name,
            "addr": addr,
            "classification": classification,
            "device_model": device_model,
            "param": param,
            "comment": comment,
        }

        db_device = DB_Device.EnterpriseDeviceRepository()
        db_device.add_device(device_data)

        self.finish()


class DeviceEditHandler(APIHandler):
    """
    - 描述:企业节点,编辑设备
    - 请求方式:post
    - 请求参数:
    >- device_id, int, 设备id
    >- name, string, 设备名称
    >- addr, string, 设备位置
    >- classification, string, 设备分类的short uuid
    >- device_model, string, 设备型号
    >- param, string, 设备参数
    >- comment, string, 备注
    - 返回值:无
    """

    @authenticated
    def post(self):
        device_id = self.get_int_argument("device_id")
        name = self.get_escaped_argument("name", "")
        addr = self.get_escaped_argument("addr", "")
        classification = self.get_escaped_argument("classification", "")
        device_model = self.get_escaped_argument("device_model", "")
        param = self.get_escaped_argument("param", "")
        comment = self.get_escaped_argument("comment", "")
        if not device_id:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备id不能为空")
        if not name:
            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "设备名称不能为空")

        device_data = {
            "id": device_id,
            "name": name,
            "addr": addr,
            "classification": classification,
            "device_model": device_model,
            "param": param,
            "comment": comment,
        }

        db_device = DB_Device.EnterpriseDeviceRepository()
        db_device.edit_device(device_data)
        self.finish()


class DeviceDeleteHandler(APIHandler):
    """
    ### /enterprise/entity/nodes/device/delete

    - 描述:企业节点,删除设备
    - 请求方式:post
    - 请求参数:
    >- node_id, int
    >- device_id, int, 设备id
    - 返回值:无
    """

    @authenticated
    def post(self):
        # node_id = self.get_int_argument('node_id')
        device_id = self.get_int_argument("device_id")
        if not device_id:
            raise errors.HTTPAPIError(
                errors.ERROR_BAD_REQUEST, "企业节点或设备不能为空"
            )
        db_device = DB_Device.EnterpriseDeviceRepository()
        db_device.delete_device(device_id)
        self.finish()


class DeviceListHandler(APIHandler):
    """
    - 描述:企业节点,设备列表
    - 请求方式:post
    - 请求参数:
    > - pageNo
    > - pageSize
    > - node_id, int, 节点id
    - 返回值:
    ```
        {
            "count": 123,
            "data": [
                {
                    "device_id":  123,
                    "device_name": "xxx",
                    "device_class": "xxx", 设备类型
                    "deployed": 0, # 是否部署, 0/未部署, 1/已部署
                },
                ...
            ]
        }
    ```
    """

    @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_device = DB_Device.EnterpriseDeviceRepository()
        devices = db_device.list_devices(
            node_id=node_id, pageNo=pageNo, pageSize=pageSize
        )

        logging.info(devices)

        self.finish({"count": devices["total_count"], "data": devices["devices"]})


class DeviceListSimpleHandler(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_device = DB_Device.EnterpriseDeviceRepository()
        devices = db_device.list_simple_devices(node_id=node_id)
        logging.info(devices)
        self.finish({"data": devices})


class DeviceInfoHandler(APIHandler):
    """
    - 描述:企业节点,设备信息
    - 请求方式:post
    - 请求参数:
    > - device_id, int, 设备id
    - 返回值:
    ```
        {
            "name": "xxx",
            "addr": "xxx",
            "classification": "xxx",
            "device_model": "xxx",
            "param": "xxx",
            "comment": "xxx",
        }
    ```
    """

    def post(self):
        device_id = self.get_int_argument("device_id")
        if not device_id:
            raise errors.HTTPAPIError(
                errors.ERROR_BAD_REQUEST, "企业节点或设备不能为空"
            )
        db_device = DB_Device.EnterpriseDeviceRepository()
        device = db_device.get_device(device_id=device_id)
        logging.info(device)
        self.finish(device)