/**
 * 智能主机设备模型
 * @file IotJbqServer.js
 * @description 智能主机设备数据模型，对应iot_jbq_server表
 */
const { DataTypes, Model } = require('sequelize');
const { sequelize } = require('../config/database-simple');

class IotJbqServer extends Model {
  /**
   * 获取设备状态文本
   */
  getStatusText() {
    const statusMap = {
      0: '离线',
      1: '在线',
      2: '报警',
      3: '维护'
    };
    return statusMap[this.state] || '未知';
  }

  /**
   * 获取设备状态颜色
   */
  getStatusColor() {
    const colorMap = {
      0: 'red',      // 离线
      1: 'green',    // 在线
      2: 'orange',   // 报警
      3: 'blue'      // 维护
    };
    return colorMap[this.state] || 'default';
  }

  /**
   * 获取GPS状态文本
   */
  getGpsStatusText() {
    const gpsMap = {
      'A': '已定位',
      'V': '未定位'
    };
    return gpsMap[this.gps_state] || '未知';
  }

  /**
   * 获取GPS状态颜色
   */
  getGpsStatusColor() {
    const colorMap = {
      'A': 'green',   // 已定位
      'V': 'red'      // 未定位
    };
    return colorMap[this.gps_state] || 'default';
  }

  /**
   * 获取电池电量百分比
   */
  getBatteryPercent() {
    const voltage = parseFloat(this.voltage) || 0;
    // 假设电池电压范围是3.0V-4.2V
    if (voltage >= 4.2) return 100;
    if (voltage <= 3.0) return 0;
    return Math.round(((voltage - 3.0) / 1.2) * 100);
  }

  /**
   * 获取温度数值
   */
  getTemperatureValue() {
    return parseFloat(this.temperature) || 0;
  }

  /**
   * 获取信号强度文本
   */
  getSignalText() {
    const signal = parseInt(this.signa) || 0;
    if (signal >= 20) return '强';
    if (signal >= 10) return '中';
    if (signal >= 5) return '弱';
    return '无信号';
  }

  /**
   * 获取信号强度颜色
   */
  getSignalColor() {
    const signal = parseInt(this.signa) || 0;
    if (signal >= 20) return 'green';
    if (signal >= 10) return 'orange';
    if (signal >= 5) return 'red';
    return 'red';
  }

  /**
   * 判断是否低电量
   */
  isLowBattery() {
    return this.getBatteryPercent() < 20;
  }

  /**
   * 判断是否需要维护
   */
  needsMaintenance() {
    return this.state === 3 || this.isLowBattery() || this.gps_state === 'V';
  }

  /**
   * 获取最后更新时间
   */
  getLastUpdateTime() {
    if (this.uptime) {
      const date = new Date(this.uptime * 1000);
      return date.toLocaleString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
      }).replace(/\//g, '-');
    }
    return '未知';
  }

  /**
   * 获取设备编号（使用sid字段）
   */
  getDeviceNumber() {
    return this.sid || '无编号';
  }

  /**
   * 判断设备是否联网
   * 通过 simId 字段是否为空来判断联网状态
   */
  isOnline() {
    return this.simId && this.simId.trim() !== '';
  }

  /**
   * 获取联网状态文本
   */
  getNetworkStatusText() {
    return this.isOnline() ? '已联网' : '未联网';
  }

  /**
   * 获取联网状态颜色
   */
  getNetworkStatusColor() {
    return this.isOnline() ? 'green' : 'red';
  }
}

// 初始化模型
IotJbqServer.init({
  id: {
    type: DataTypes.BIGINT,
    primaryKey: true,
    autoIncrement: true,
    comment: '主机设备ID'
  },
  org_id: {
    type: DataTypes.INTEGER.UNSIGNED,
    allowNull: false,
    comment: '组织ID'
  },
  title: {
    type: DataTypes.STRING(50),
    allowNull: false,
    defaultValue: '',
    comment: '设备标题'
  },
  uid: {
    type: DataTypes.BIGINT,
    allowNull: false,
    comment: '用户ID'
  },
  time: {
    type: DataTypes.INTEGER,
    allowNull: false,
    comment: '设备时间戳'
  },
  uptime: {
    type: DataTypes.INTEGER,
    allowNull: false,
    comment: '上传时间戳'
  },
  distribute_time: {
    type: DataTypes.INTEGER,
    allowNull: true,
    defaultValue: 0,
    comment: '分发时间'
  },
  state: {
    type: DataTypes.INTEGER,
    allowNull: true,
    comment: '设备状态'
  },
  sid: {
    type: DataTypes.STRING(30),
    allowNull: false,
    comment: '设备序列号'
  },
  gps_state: {
    type: DataTypes.STRING(5),
    allowNull: false,
    comment: 'GPS状态'
  },
  lat: {
    type: DataTypes.STRING(100),
    allowNull: false,
    comment: '纬度'
  },
  lon: {
    type: DataTypes.STRING(100),
    allowNull: false,
    comment: '经度'
  },
  signa: {
    type: DataTypes.STRING(200),
    allowNull: false,
    comment: '信号强度'
  },
  voltage: {
    type: DataTypes.STRING(10),
    allowNull: false,
    comment: '电池电压'
  },
  temperature: {
    type: DataTypes.STRING(10),
    allowNull: false,
    comment: '设备温度'
  },
  ver: {
    type: DataTypes.STRING(100),
    allowNull: false,
    comment: '固件版本'
  },
  macsid: {
    type: DataTypes.BIGINT,
    allowNull: true,
    comment: 'MAC序列号'
  },
  ctwing: {
    type: DataTypes.TEXT,
    allowNull: true,
    comment: 'CTWing信息'
  },
  bank_lanwei: {
    type: DataTypes.INTEGER,
    allowNull: true,
    comment: '栏位编号'
  },
  bank_house: {
    type: DataTypes.INTEGER,
    allowNull: true,
    comment: '栏舍编号'
  },
  bank_item_id: {
    type: DataTypes.INTEGER,
    allowNull: true,
    comment: '栏位项目ID'
  },
  fence_id: {
    type: DataTypes.INTEGER.UNSIGNED,
    allowNull: false,
    defaultValue: 0,
    comment: '围栏ID'
  },
  source_id: {
    type: DataTypes.BIGINT,
    allowNull: true,
    comment: '数据源ID'
  },
  simId: {
    type: DataTypes.STRING(50),
    allowNull: true,
    comment: 'SIM卡ID，用于判断联网状态'
  }
}, {
  sequelize,
  modelName: 'IotJbqServer',
  tableName: 'iot_jbq_server',
  timestamps: false, // 该表没有created_at和updated_at字段
  indexes: [
    {
      fields: ['uid']
    },
    {
      fields: ['sid']
    },
    {
      fields: ['state']
    },
    {
      fields: ['fence_id']
    },
    {
      fields: ['source_id']
    }
  ]
});

module.exports = IotJbqServer;
