<?php
namespace app\devices\model;

use think\Model;
use think\Db;

/**
 * 设备模型类
 */
class Device extends Model
{
    // 设置表名
    protected $name = 'device';
    
    // 设置主键
    protected $pk = 'id';
    
    // 自动写入时间戳
    protected $autoWriteTimestamp = 'int';
    
    // 定义时间戳字段名
    protected $createTime = 'createTime';
    protected $updateTime = 'updateTime';
    protected $deleteTime = 'deleteTime';
    
    // 定义字段类型
    protected $type = [
        'id' => 'integer',
        'createTime' => 'integer',
        'updateTime' => 'integer',
        'deleteTime' => 'integer',
        'alive' => 'integer',
        'isDeleted' => 'integer',
        'tenantId' => 'integer',
        'groupId' => 'integer'
    ];
    
    /**
     * 获取设备总数
     * @param array $where 查询条件
     * @return int 设备总数
     */
    public static function getDeviceCount($where = [])
    {
        // 默认只统计未删除的设备
        if (!isset($where['isDeleted']) && !isset($where['d.isDeleted'])) {
            $where['isDeleted'] = 0;
        }
        
        // 确定是否使用了表别名
        $hasAlias = false;
        foreach ($where as $key => $value) {
            if (strpos($key, '.') !== false) {
                $hasAlias = true;
                break;
            }
        }
        
        // 如果使用了表别名，则需要使用查询构造器
        if ($hasAlias) {
            return self::alias('d')->where($where)->count();
        } else {
            return self::where($where)->count();
        }
    }
    
    /**
     * 获取设备列表
     * @param array $where 查询条件
     * @param string $order 排序方式
     * @param int $page 页码
     * @param int $limit 每页数量
     * @return \think\Paginator 分页对象
     */
    public static function getDeviceList($where = [], $order = 'd.id desc', $page = 1, $limit = 10)
    {
        // 默认只查询未删除的设备
        if (!isset($where['isDeleted'])) {
            $where['d.isDeleted'] = 0;
        }

        // 构建查询对象
        $query = self::alias('d')
            ->field(['d.id', 'd.imei', 'd.memo', 'w.wechatId', 'd.alive', 'w.totalFriend'])
            ->leftJoin('tk_wechat_account w', 'd.imei = w.imei COLLATE utf8mb4_unicode_ci');

        // 处理查询条件
        foreach ($where as $key => $value) {
            // 处理特殊的exp表达式条件
            if (is_numeric($key) && is_array($value) && isset($value[0]) && $value[0] === 'exp') {
                // 直接添加原始SQL表达式
                $query->whereExp('', $value[1]);
                continue;
            }
            
            // 处理普通条件
            $query->where($key, $value);
        }

        // 返回分页结果
        return $query->order($order)
            ->paginate($limit, false, ['page' => $page]);
    }
    
    /**
     * 获取设备详情
     * @param int $id 设备ID
     * @return array|null 设备信息
     */
    public static function getDeviceInfo($id)
    {
        return self::where('id', $id)
            ->where('isDeleted', 0)
            ->find();
    }
    
    /**
     * 添加设备
     * @param array $data 设备数据
     * @return int 新增设备ID
     */
    public static function addDevice($data)
    {
        $device = new self();
        $device->allowField(true)->save($data);
        return $device->id;
    }
    
    /**
     * 更新设备
     * @param int $id 设备ID
     * @param array $data 设备数据
     * @return bool 更新结果
     */
    public static function updateDevice($id, $data)
    {
        return self::where('id', $id)
            ->where('isDeleted', 0)
            ->update($data);
    }
    
    /**
     * 删除设备（软删除）
     * @param int $id 设备ID
     * @return bool 删除结果
     */
    public static function deleteDevice($id)
    {
        return self::where('id', $id)
            ->update([
                'isDeleted' => 1,
                'deleteTime' => date('Y-m-d H:i:s', time())
            ]);
    }
    
    /**
     * 按设备品牌统计数量
     * @return array 统计结果
     */
    public static function countByBrand()
    {
        return self::where('isDeleted', 0)
            ->group('brand')
            ->field('brand, count(*) as count')
            ->select();
    }
    
    /**
     * 按设备在线状态统计数量
     * @return array 统计结果
     */
    public static function countByStatus()
    {
        return self::where('isDeleted', 0)
            ->group('alive')
            ->field('alive, count(*) as count')
            ->select();
    }
} 