<?php

namespace app\api\controller\dataview;

use app\api\controller\BaseApiController;
use app\common\logic\RemoteRequestLogic;
use app\common\model\animal_info\AnimalInfo;
use app\common\model\device\Device;
use app\common\model\dict\DictData;
use app\common\model\farm\Farm;
use app\common\model\fence_house\FenceHouse;
use app\common\model\land\Land;
use app\common\model\land\Product;
use app\common\model\product\ProductDevice;
use think\exception\ValidateException;

class FarmController extends BaseApiController
{
    public array $notNeedLogin = [
        'farmCount','breedTypeCount','farmInfo','deviceAlarmCount','deviceCount','alarmRangeList'
    ];
    public function initialize()
    {
        parent::initialize();
        $this->areaCode = $this->request->param('areaCode', '');
        $this->streetCode = $this->request->param('streetCode', '');
        if ($this->areaCode == '') {
            throw new ValidateException('未获取到位置信息');
        }
    }

    public function farmCount()
    {
        $query = Farm::alias('f')->where(function ($query) {
            if ($this->streetCode != '') {
                $query->where('f.street', $this->streetCode);
            } else {
                $query->where('f.area', $this->areaCode);
            }
        });
        // 地块数量
        $farmCount = $query->count();
        // 养殖规模
        $totalScale = $query->sum('form_scale');
        // 基地列表
        $farmList = $query->select()->each(function ($farm){
            // 档案数量
            $fenceHouseIds = FenceHouse::where('farm_id', $farm['id'])->column('id');
            $farm['animal_count'] = AnimalInfo::whereIn('fence_house_id', $fenceHouseIds)->count();
            $fenceHouse = FenceHouse::where('farm_id', $farm['id'])->order('id desc')->findOrEmpty()->toArray();
            if(empty($fenceHouse)){
                $farm['video_url'] = '';
                $farm['device_id'] = 0;
                return $farm;
            }
            $product = Product::where('fence_house_id', $fenceHouse['id'])->findOrEmpty()->toArray();
            if(empty($product)){
                $farm['video_url'] = '';
                $farm['device_id'] = 0;
                return $farm;
            }
            $deviceIds = ProductDevice::where('product_id', $product['id'])->column('device_id');
            $device =  Device::whereIn('id', $deviceIds)->where('type', 2)->findOrEmpty();
            if(empty($device)){
                $farm['video_url'] = '';
                $farm['device_id'] = 0;
                return $farm;
            }
            $farm['video_url'] = $device['video_url'];
            $farm['device_id'] = $device['id'];
            return $farm;
        })->toArray();
        return $this->success('成功', compact('farmCount', 'totalScale', 'farmList'));
    }

    public function breedTypeCount()
    {
        $breedTypeRows = DictData::where('type_value', 'breed_type')->field('name,value')->select()->each(function($breedType){
            $breedType['animalCount'] = Farm::alias('f')->join('fence_house fh', 'f.id=fh.farm_id')->where(function ($query) {
                if ($this->streetCode != '') {
                    $query->where('f.street', $this->streetCode);
                } else {
                    $query->where('f.area', $this->areaCode);
                }
            })->where('fh.animal_type', $breedType['value'])->count();
        })->toArray();

        $fenceHouseIds = Farm::alias('f')->join('fence_house fh', 'f.id=fh.farm_id')->where(function ($query) {
            if ($this->streetCode != '') {
                $query->where('f.street', $this->streetCode);
            } else {
                $query->where('f.area', $this->areaCode);
            }
        })->column('fh.id');

        $animalList = AnimalInfo::whereIn('fence_house_id', $fenceHouseIds)->select();
        return $this->success('成功', compact('breedTypeRows', 'animalList'));
    }

    public function centralCount()
    {

        $query = Farm::alias('f')->where(function ($query) {
            if ($this->streetCode != '') {
                $query->where('f.street', $this->streetCode);
            } else {
                $query->where('f.area', $this->areaCode);
            }
        });
        // 地块数量
        $farmCount = $query->count();
        // 养殖规模
        $totalScale = $query->sum('form_scale');
        // 养殖种类
        $breedCount = $query->group('breed_type')->count();

        return $this->success('成功', compact('farmCount', 'totalScale', 'breedCount'));
    }

    public function farmInfo()
    {
        // 获取栏舍信息
        $params = $this->request->param();
        $farmInfo = Farm::where('id', $params['id'])->findOrEmpty()->toArray();
        $data = FenceHouse::where('farm_id',$params['id'])->findOrEmpty()->toArray();
        $product = Product::where('fence_house_id', $data['id'])->findOrEmpty()->toArray();
        if(empty($product)){
            return $this->fail('栏舍暂未绑定设备',[]);
        }
        $deviceIds = ProductDevice::where('product_id', $product['id'])->column('device_id');
        $device =  Device::whereIn('id', $deviceIds)->where('type', 2)->findOrEmpty();
        $farmInfo['video_url'] = $device['video_url'];
        $farmInfo['device_id'] = $device['id'];

        $breedTypeRows = DictData::where('type_value', 'breed_type')->field('name,value')->select()->each(function($breedType) use($params){
            $breedType['animalCount'] = Farm::alias('f')->join('fence_house fh', 'f.id=fh.farm_id')->where('f.id', $params['id'])->where('fh.animal_type', $breedType['value'])->count();
        })->toArray();
        return $this->success('成功', compact('farmInfo',  'breedTypeRows'));
    }

    // 设备告警统计
    public function deviceAlarmCount()
    {
        $params = $this->request->param();
        $deviceList = Device::alias('d')->where(function ($query) use($params) {
                    $farmIds = [$params['id']];
                    $fenceHouseIds = FenceHouse::whereIn('farm_id', $farmIds)->column('id');
                    $productIds = Product::whereIn('fence_house_id', $fenceHouseIds)->column('id');
                    $deviceIds = ProductDevice::whereIn('product_id', $productIds)->column('device_id');
                    $query->whereIn('d.id', $deviceIds);
        })->select()->toArray();

        // 请求mqtt接口
        $data = RemoteRequestLogic::getAlarmData($deviceList);
        foreach($data as $k=>$v){
            $time[$k] = strtotime($v['alarm_time']);
        }
        array_multisort($time, SORT_DESC, $data);
        $list = array_slice($data, 0, 7);
        return $this->success('成功', compact('list'));
    }

    // 监测设备数量统计
    public function  deviceCount()
    {
        $params = $this->request->param();
        $query = Device::alias('d')->where(function ($query) use ($params){
                    $farmIds = [$params['id']];
                $fenceHouseIds = FenceHouse::whereIn('farm_id', $farmIds)->column('id');
                $productIds = Product::whereIn('fence_house_id', $fenceHouseIds)->column('id');
                $deviceIds = ProductDevice::whereIn('product_id', $productIds)->column('device_id');
                $query->whereIn('d.id', $deviceIds);
        });
        $deviceList = $query->select()->toArray();
        $total = $query->count();

        $online = $query->where('d.is_online', 1)->count();

        $offline = $query->where('d.is_online', 2)->count();


        // 请求mqtt
        [$alarmCount,$todayAlarmCount] = RemoteRequestLogic::getAlarmCount($deviceList);

        return $this->success('成功', compact('total', 'online', 'offline', 'alarmCount', 'todayAlarmCount'));

    }

    public function alarmRangeList()
    {
        $params = $this->request->param();
        $farmIds = [$params['id']];
        $fenceHouseIds = FenceHouse::whereIn('farm_id', $farmIds)->column('id');
        $productIds = Product::whereIn('fence_house_id', $fenceHouseIds)->column('id');
        $deviceIds = ProductDevice::whereIn('product_id', $productIds)->column('device_id');
        $list = RemoteRequestLogic::getRangeMonitorData($deviceIds);
        return $this->success('成功', $list);
    }
}