# -*- coding: utf-8 -*-
import logging
from datetime import datetime

import requests
import json
from odoo import fields, models, api
from odoo.exceptions import ValidationError
from odoo.http import request
from odoo.addons.sf_base.commons.common import Common

_logger = logging.getLogger(__name__)


class MachineBrandTags(models.Model):
    _name = 'sf.machine.brand.tags'
    _description = '标签'
    name = fields.Char('名称', size=50)
    color = fields.Integer('颜色', default=0)


class MachineControlSystem(models.Model):
    _name = 'sf.machine.control_system'
    _description = '控制系统'

    code = fields.Char('编码', size=10)
    name = fields.Char('名称', size=10)
    brand_id = fields.Many2one('sf.machine.brand', '品牌')
    active = fields.Boolean('有效', default=True)


# 品牌标签
class MachineBrand(models.Model):
    _name = 'sf.machine.brand'
    _description = '品牌'

    name = fields.Char('名称')
    tag_ids = fields.Many2many('sf.machine.brand.tags', 'rel_machine_brand_tags', string='类别')
    image_brand = fields.Image("品牌图片")
    active = fields.Boolean('有效', default=True)
    code = fields.Char('编码')


# 机床
class MachineTool(models.Model):
    _name = 'sf.machine_tool'
    _description = '机床'

    def get_no(self):
        partner = self.env['sf.machine_tool'].sudo().search(
            [('MTcode', '!=', '')],
            limit=1,
            order="id desc")
        if not partner:
            num = "%04d" % 1

        else:
            m = int(partner.MTcode) + 1
            num = "%04d" % m
        return num

    MTcode = fields.Char("编码", default=get_no)
    code = fields.Char('行业编码')
    name = fields.Char('名称')
    knife_type = fields.Selection(
        [("BT40", "BT40"), ("BT30", "BT30")],
        default="", string="刀把类型")
    number_of_knife_library = fields.Integer('刀库数量')
    rotate_speed = fields.Integer('转速')
    number_of_axles = fields.Selection(
        [("三轴", "三轴"), ("四轴", "四轴"), ("五轴", "五轴")],
        default="", string="轴数")
    # 加工进程
    x_axis = fields.Integer('X轴')
    y_axis = fields.Integer('Y轴')
    z_axis = fields.Integer('Z轴')
    b_axis = fields.Integer('B轴')
    c_axis = fields.Integer('C轴')
    remark = fields.Text('备注')
    is_binding = fields.Boolean('是否绑定机床', default=False)
    precision = fields.Float('加工精度')
    control_system_id = fields.Many2one('sf.machine.control_system',
                                        string="控制系统")
    # 多个机床型号对应一个机床
    type_id = fields.Many2one('sf.machine_tool.type', '型号')
    brand_id = fields.Many2one('sf.machine.brand', string='品牌')
    state = fields.Selection(
        [("正常", "正常"), ("故障", "故障"), ("不可用", "不可用")],
        default='正常', string="机床状态")

    # 一个机床对应一個加工工厂，一个加工工厂对应多个机床
    factory_id = fields.Many2one('res.partner', string='所属工厂',
                                 domain="[('is_factory', '=', True)]")
    # 一个机床对应一个供应商，一个供应商对应多个机床
    supplier_id = fields.Many2one('res.partner', string='制造商',
                                  domain="[('is_vendor', '=', True)]")
    registration_date = fields.Date('注册日期')
    state_zc = fields.Selection([("已注册", "已注册"), ("未注册", "未注册")], string="注册状态", default='未注册', tracking=True)
    active = fields.Boolean('有效', default=True)

    @api.constrains('rotate_speed')
    def _check_rotate_speed(self):
        if self.rotate_speed <= 0:
            raise ValidationError("转速不能为0")

    @api.constrains('precision')
    def _check_precision(self):
        if self.precision <= 0.00:
            raise ValidationError("加工精度不能为0")

    @api.constrains('number_of_knife_library')
    def _check_number_of_knife_library(self):
        if self.number_of_knife_library <= 0:
            raise ValidationError("刀库数量不能为0")

    @api.constrains('x_axis')
    def _check_x_axis(self):
        if self.x_axis <= 0:
            raise ValidationError("加工行程里x轴不能为0")

    @api.constrains('y_axis')
    def _check_y_axis(self):
        if self.y_axis <= 0:
            raise ValidationError("加工行程里y轴不能为0")

    @api.constrains('z_axis')
    def _check_z_axis(self):
        if self.z_axis <= 0:
            raise ValidationError("加工行程里z轴不能为0")

    @api.constrains('b_axis')
    def _check_b_axis(self):
        if self.number_of_axles == '四轴':
            print(self.number_of_axles)
            if self.b_axis <= 0:
                raise ValidationError("加工行程里b轴不能为0")

    @api.constrains('c_axis')
    def _check_c_axis(self):
        if self.number_of_axles == '五轴':
            if self.c_axis <= 0:
                raise ValidationError("加工行程里c轴不能为0")

    @api.onchange('type_id')
    def get_type_info(self):
        for item in self:
            item.knife_type = item.type_id.knife_type
            item.number_of_knife_library = item.type_id.number_of_knife_library
            item.number_of_axles = item.type_id.number_of_axles
            item.rotate_speed = item.type_id.rotate_speed
            item.precision = item.type_id.precision
            item.control_system_id = item.type_id.control_system_id
            item.x_axis = item.type_id.x_axis
            item.y_axis = item.type_id.y_axis
            item.z_axis = item.type_id.z_axis
            item.b_axis = item.type_id.b_axis
            item.c_axis = item.type_id.c_axis

    # 注册同步机床
    def enroll_machine_tool(self):
        sf_sync_config = self.env['res.config.settings'].get_values()
        token = sf_sync_config['token']
        sf_secret_key = sf_sync_config['sf_secret_key']
        headers = Common.get_headers(self, token, sf_secret_key)
        strurl = sf_sync_config['sf_url'] + self.crea_url
        objs_all = self.env['sf.machine_tool'].search([('MTcode', '=', self.MTcode)])
        machine_tool_list = []
        if objs_all:
            for item in objs_all:
                val = {
                    'MTcode': item.MTcode,
                    'factory_token': token,
                    'id': item.id,
                    'name': item.name,
                    'code': item.code,
                    'precision': item.precision,
                    'knife_type': item.knife_type,
                    'number_of_knife_library': item.number_of_knife_library,
                    'rotate_speed': item.rotate_speed,
                    'number_of_axles': item.number_of_axles,
                    'control_system_id': self.env['sf.machine.control_system'].search(
                        [('id', '=', item.control_system_id.id)]).code,
                    'type_id': self.env['sf.machine_tool.type'].search([('id', '=', item.type_id.id)]).code,
                    'brand_id': self.env['sf.machine.brand'].search([('id', '=', item.brand_id.id)]).code,
                    'supplier_id': item.supplier_id.id,
                    'x_axis': item.x_axis,
                    'y_axis': item.y_axis,
                    'z_axis': item.z_axis,
                    'b_axis': item.b_axis,
                    'c_axis': item.c_axis,
                    'state': item.state,
                    'active': item.active,

                }
                machine_tool_list.append(val)
            # kw = machine_tool_list
            kw = json.dumps(machine_tool_list, ensure_ascii=False)
            r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
            ret = r.json()
            self.code = ret['message']
            self.state_zc = "已注册"
            if r == 200:
                return "机床注册成功"
        else:
            raise ValidationError("没有注册机床信息")


class MachineToolType(models.Model):
    _name = 'sf.machine_tool.type'
    _description = '机床型号'
    # _order = 'priority desc, code, name, id'

    name = fields.Char('名称')
    brand_id = fields.Many2one('sf.machine.brand', string='品牌')
    knife_type = fields.Selection(
        [("BT40", "BT40"), ("BT30", "BT30")],
        default="", string="刀把类型")
    number_of_knife_library = fields.Integer('刀库数量')
    rotate_speed = fields.Integer('转速')
    # 多个型号对应一个机床
    machine_tool_id = fields.Many2one('sf.machine_tool', '机床')
    number_of_axles = fields.Selection(
        [("三轴", "三轴"), ("四轴", "四轴"), ("五轴", "五轴")],
        default="", string="轴数")
    # 加工进程
    x_axis = fields.Integer('X轴')
    y_axis = fields.Integer('Y轴')
    z_axis = fields.Integer('Z轴')
    b_axis = fields.Integer('B轴')
    c_axis = fields.Integer('C轴')
    remark = fields.Text('备注')
    precision = fields.Float('加工精度')
    control_system_id = fields.Many2one('sf.machine.control_system',
                                        string="控制系统")
    active = fields.Boolean('有效', default=True)
    code = fields.Char('编码')


# 刀具
class CuttingTool(models.Model):
    _name = 'sf.cutting_tool.category'
    _description = '刀具类别'
    code = fields.Char('编码')
    name = fields.Char('名称')
    remark = fields.Text('备注')
    active = fields.Boolean('有效', default=True)


class CuttingToolType(models.Model):
    _name = 'sf.cutting_tool.type'
    _description = '刀具型号'
    code = fields.Char('编码')
    name = fields.Char('名称')
    diameter = fields.Integer('直径')
    long_blade = fields.Integer('避空长/刃长')
    cone_angle_pitch = fields.Integer('锥角/节距')
    shank_diameter = fields.Integer('柄径')
    taper_shank_length = fields.Integer('锥柄长')
    tool_length = fields.Integer('刀具总长')
    blade_number = fields.Integer('刃数')
    category_id = fields.Many2one('sf.cutting_tool.category', string='刀具类别')
    brand_id = fields.Many2one('sf.machine.brand', string='品牌')
    remark = fields.Text('备注')
    active = fields.Boolean('有效', default=True)
