<?php
/**
 * Created by PhpStorm.
 * User: Mead
 * Date: 2019/9/3
 * Time: 8:05 PM
 */

namespace App\Servers;

use App\Handlers\BikeStatusInfoSyncHandler;
use App\Maps\BikeMap;
use App\Models\BatteryTraitModel;
use App\Models\WarningLogTraitModel;

class HeartBeatServer extends BaseServer
{
    use BatteryTraitModel, WarningLogTraitModel;

    public function main($body)
    {
        $data = $this->decode($body);
        self::log($data, 'HeartBeatServer', self::$LOG_MAJOR);

        $bike_no = $_SESSION['bike_no'];

        if (!$bike_no) return [];

        $box_no = $data['box_no'];

        if ($data['box_no'] === '003454406') return $this->response();

        if (!$this->is_ep_min($data['box_no'], 'heart', 30)) {
            $cols['is_link'] = BikeMap::LINK_ONLINE;
            $cols['battery_power'] = $this->byVoltageGetElectric($data['battery_voltage']);
            $cols['is_low_battery_power'] = BikeMap::BATTERY_POWER_OK;
            if ($cols['battery_power'] <= self::$max_ride_v) {
                // 低电量
                $cols['is_low_battery_power'] = BikeMap::BATTERY_POWER_LOW;

                //电量低报警信息
                $this->warningLogBatteryLow($bike_no, $data['box_no'], ['battery_power' => $cols['battery_power']], $body, 'heart');

            }
            $this->db->update('bikes')->where('box_no = ' . $data['box_no'])->cols($cols)->query();
        } else {
            //换电池及时更新电量
            $openBatteryKey = "cache:open_battery:{$box_no}";
            if ($this->redis->exists($openBatteryKey)) {
                $cols['is_link'] = BikeMap::LINK_ONLINE;
                $cols['battery_power'] = $this->byVoltageGetElectric($data['battery_voltage']);
                $cols['is_low_battery_power'] = BikeMap::BATTERY_POWER_OK;
                if ($cols['battery_power'] <= self::$max_ride_v) {
                    // 低电量
                    $cols['is_low_battery_power'] = BikeMap::BATTERY_POWER_LOW;
                }

                $this->db->update('bikes')->where('box_no = ' . $data['box_no'])->cols($cols)->query();
            }
        }

        if ((!$data['bike_status']['is_huanche'])) {
            // 获取用户信息
            $order = (new BikeStatusInfoSyncHandler($this->redis))->getRideBikeOrderInfo($bike_no);
            if (!$order) {
                //非法骑行
                $num = $this->redis->incr('bike:illegal:open:' . $bike_no, 1);
                $this->redis->expire('bike:illegal:open:' . $bike_no, 120);
                BikeControl::closeLock($data['box_no']);

                if ($num > 5) {
                    if (!$this->is_ep_min($box_no, 'bike:illegal:open:location', 20)) {
                        $this->warningFF($bike_no, $data['box_no'], $data, $body);
                    }
                }
            }
        }

        return $this->response();
    }

    /**
     * 解析装载的登录数据
     * @param $body
     * @return array
     * User: Mead
     */
    private function decode($body)
    {
        $i = 0;
        $box_no = $this->decodeBoxNo(self::stitching($body, $i, 5));
        $i += 5;
        // 信号强度
//        $signal_status = self::stitching($body, $i, 2);
        $i += 2;
        // 车辆状态
        $bike_status = self::stitching($body, $i, 2);
        $i += 2;
        // 电池电压
        $battery_voltage = self::stitching($body, $i, 2);
        $i += 2;
        // 相对SOC
//        $soc = self::stitching($body, $i, 1);
        $i += 1;
        // 电池余量
//        $battery_mb_free = self::stitching($body, $i, 2);
        return [
            'box_no' => $box_no,
            'bike_status' => $this->decodeBikeStatus($bike_status),
            'battery_voltage' => $this->decodeBatteryVoltage($battery_voltage),
        ];
    }
}