<?php
/**
 * Created by PhpStorm.
 * User: YRF
 * Date: 2024/6/18
 * Time: 9:36
 */

namespace app\api\controller\v6;
//允许所有的跨域请求
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: *");
header('Access-Control-Allow-Methods: POST,GET,OPTIONS');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
date_default_timezone_set('PRC');

use think\Db;
use app\common\controller\Api;

//v6 监管端功能
class Ai extends Api
{
    // 无需登录的接口,*表示全部
    protected $noNeedLogin = [];
    // 无需鉴权的接口,*表示全部
    protected $noNeedRight = ['*'];
    protected $ai_user_id = "rodneyxiong";
    protected $ai_token = "xXR91v8rbM9J550OeeR4373Bp3szixUM";
    protected $assistant_id = "Ct6OlatKkiEK";
    protected $apiUrl = "https://open.hunyuan.tencent.com/openapi/v1/agent/chat/completions";
    protected $rid = 40;

    //水库信息AI分析
    public function AiAsk()
    {
        //获得前端伟过来的数据
        $msg = $this->request->post('messages/a', '');
        //dump($msg);
        // 定义请求头
        $headers = array(
            'X-Source: openapi',
            'Content-Type: application/json',
            'Authorization: Bearer ' . $this->ai_token
        );

        if (empty($msg) || !isset($msg[0]['role'])) {
            //获得水库基本信息
            $river = Db::name('reservoir_list')
                ->where(['id' => $this->rid])
                ->find();
            //获得库容最大值
            $maxkr = Db::name('warterdata_capacityof')
                ->where(['reservoir_id' => $river['id']])
                ->order('id desc')
                ->find();

            //获得最近3天水位
            // 获取前两天的日期
            $twoDaysBefore = date('Y-m-d', strtotime('-2 day', time()));
            $twoDaysBeforeStartTimestamp = strtotime($twoDaysBefore . ' 00:00:00');
            $warerlevel = Db::name('reservoir_rain_water_level')
                ->alias('l')
                ->join("warterdata_capacityof w", "l.water_level=w.warterdata", 'left')
                ->where(['l.reservoir_id' => $river['id']])
                ->where("l.createtime>=" . $twoDaysBeforeStartTimestamp)
                ->order("l.id desc")
                ->field("l.*,w.CapacityOf")
                ->select();
            if (isset($warerlevel[0]['water_level']) && $warerlevel[0]['water_level'] > 0) {
                $nowlevel = $warerlevel[0]['water_level'];
                $nowcapof = $warerlevel[0]['CapacityOf'];
            } else {
                $nowlevel = 0;
                $nowcapof = 0;
            }

            $riverStr = $river['name'] . "正常水位" . $river['normal_water_level'] . "m,死水位" . $river['dead_water_level'] . "m,警戒水位" . $maxkr['warterdata'] . "m,当前水位" . $nowlevel . "m,当前库容" . $nowcapof . "万方,最大库容" . $river['under'] . "万方";

            $messages = array(
                array(
                    "type" => "text",
                    "text" => "以下数据是实时水库监测数据,请根据数据分析水库的水位、降雨量、渗流压力、渗流量、坝体地表位移、综合情况、以及给出当前情况的防汛方案。"
                ),
                array(
                    "type" => "text",
                    "text" => $riverStr
                )
            );

            //处理水位列表为文字
            $levelStr = "最近几天水位列表如下:";
            if (!empty($warerlevel)) {
                foreach ($warerlevel as $k => $v) {
                    $dtime = date('Y-m-d H:i:s', $v['createtime']);
                    $levelStr .= $dtime . "水位" . $v['water_level'] . "m,库容" . $v['CapacityOf'] . "万方;";
                }
                $messages[] = array(
                    "type" => "text",
                    "text" => $levelStr
                );
            }

            //获得最近3天的降雨量列表
            $rainlist = Db::name('reservoir_rain_rainfall')
                ->where(['reservoir_id' => $river['id']])
                ->where("createtime>=" . $twoDaysBeforeStartTimestamp)
                ->order("id desc")
                ->select();
            if (!empty($rainlist)) {
                $rainStr = "最近几天降雨量列表如下:";
                foreach ($rainlist as $v1) {
                    $dtime1 = date('Y-m-d H:i:s', $v1['createtime']);
                    $rainStr .= $dtime1 . "小时降雨量" . $v1['rainfall'] . "mm,当日总降雨量" . $v1['total_rainfall'] . "mm;";
                }
                $messages[] = array(
                    "type" => "text",
                    "text" => $rainStr
                );
            }

            //渗压列表
            $sy = Db::name('reservoir_dam_isotonic')
                ->where(['reservoir_id' => $river['id']])
                ->where("createtime>=" . $twoDaysBeforeStartTimestamp)
                ->order("id desc")
                ->limit(150)
                ->select();
            if (!empty($sy)) {
                $syStr = "最近几天渗流压力列表如下:";
                foreach ($sy as $v2) {
                    $dtime2 = date('Y-m-d H:i:s', $v2['createtime']);
                    $syStr .= $dtime2 . "渗压值" . $v2['value'] . "kPa,浸润性深度" . $v2['dx_value'] . "m;";
                }
                $messages[] = array(
                    "type" => "text",
                    "text" => $syStr
                );
            }
            //渗流量列表
            $slist = Db::name('reservoir_dam_seepage')
                ->where(['reservoir_id' => $river['id']])
                ->where("createtime>=" . $twoDaysBeforeStartTimestamp)
                ->order("id desc")
                ->select();
            if (!empty($slist)) {
                $sStr = "最近几天渗流量值列表如下:";
                foreach ($slist as $v3) {
                    $dtime3 = date('Y-m-d H:i:s', $v3['createtime']);
                    $sStr .= $dtime3 . "渗流量值" . $v3['value'] . "L/s;";
                }
                $messages[] = array(
                    "type" => "text",
                    "text" => $sStr
                );
            }

            //坝体地表位移
            $disp = Db::name('reservoir_dam_displacement')
                ->where(['reservoir_id' => $river['id']])
                ->where("createtime>=" . $twoDaysBeforeStartTimestamp)
                ->order("id desc")
                ->select();
            if (!empty($disp)) {
                $dStr = "最近几天坝体地表位移列表如下:";
                foreach ($disp as $v4) {
                    $dtime4 = date('Y-m-d H:i:s', $v4['createtime']);
                    $dStr .= $dtime4 . "水平位移x" . $v4['horizontal'] . "mm,水平位移Y" . $v4['horizontalY'] . "mm,垂直位移z" . $v4['vertical'] . "mm;";
                }
                $messages[] = array(
                    "type" => "text",
                    "text" => $dStr
                );
            }

            //组装数据发和回复的列表
            $msg = array(
                array(
                    "role" => "user",
                    "content" => $messages
                ),
            );
        }

        $data = json_encode([
            "assistant_id" => $this->assistant_id,
            "user_id" => $this->ai_user_id,
            "stream" => false,
            "messages" => $msg
        ]);

        //dump($data);die;

        //发送请求
        // 初始化 cURL
        $ch = curl_init($this->apiUrl);

        // 设置选项
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

        // 发送请求并获取响应
        $response = curl_exec($ch);

        // 检查是否有错误发生
        if (curl_errno($ch)) {
            $error = curl_error($ch);
            var_dump($error);
        }

        // 关闭 cURL 资源
        curl_close($ch);

        // 处理响应
        $response = json_decode($response, true);
        if (!empty($response['choices'][0]['message'])) {
            $msg[] = array(
                "role" => "assistant",
                "content" => array(
                    array(
                        "type" => "text",
                        "text" => $response['choices'][0]['message']['content']
                    ),
                )
            );
        } else {
            //dump($response);
            $this->error("请求超时");
        }

        $this->success('获取成功', $msg);
    }

}