<?php

namespace app\api\controller;

use addons\epay\library\Service;
use app\common\controller\Api;
use app\common\model\HotelModel;
use app\common\model\HotelOrderModel;
use app\common\model\HotelRoomModel;
use app\common\model\PayOrderModel;
use app\common\model\TravelModel;
use app\common\model\UniversityEventModel;
use app\common\model\Wallet;
use app\utils\CurlUtil;
use app\utils\Service\Tencent\TencentIm;
use think\Db;

/**
 * 老年大学 活动板块
 */
class Travel extends Api
{
    protected $noNeedLogin = [''];
    protected $noNeedRight = ['*'];
    protected $status      = [
        0 => '全部',
        1 => '待入住',
        2 => '已入住',
        3 => '已取消',
    ];

    // 列表
    public function list()
    {
        $params                  = $this->request->param();
        $params['sort_distance'] = !empty($params['sort_distance']) ? $params['sort_distance'] : 1;
        $params['sort_price']    = !empty($params['sort_price']) ? $params['sort_price'] : 1;
        $params['sort_days']     = !empty($params['sort_days']) ? $params['sort_days'] : 1;
        $field                   = ['id', 'name', 'image', 'price', 'original_price', 'days', 'night', 'lat', 'lng'];
        if (!empty($params['lng']) && !empty($params['lng'])) {
            $field[] = "(st_distance(point ({$params['lng']}, {$params['lat']}),point(lng,lat))*111195) as distance";
        }
        $query = TravelModel::field($field);

        if (!empty($params['lng']) && !empty($params['lng'])) {
            if ($params['sort_distance'] == 1) {
                $query->order('distance asc');
            } else {
                $query->order('distance desc');
            }
        }

        if ($params['sort_price'] == 1) {
            $query->order('price asc');
        } else {
            $query->order('price desc');
        }

        if ($params['sort_days'] == 1) {
            $query->order('days asc');
        } else {
            $query->order('days desc');
        }

        $list = $query->where('status', 1)
            ->order('weigh desc')
            ->order('id desc')
            ->autopage()
            ->select();
        foreach ($list as $k => $v) {
            // 计算距离
            $list[$k]['distance'] = distance_ext($v['distance'] ?? -1);
        }
        return $this->success('success', $list);
    }

    // 详情
    public function info()
    {
        $params = $this->request->param();
        $query  = TravelModel::where('id', $params['id']);
        $info   = $query->where('status', 1)->find();
        if (!$info) {
            return $this->error('信息不存在');
        }
        return $this->success('success', $info);
    }

    public function order_page()
    {
        $params = $this->request->param();
        if (empty($params['travel_id'])) {
            return $this->error('参数缺失');
        }
        if (empty($params['num'])) {
            return $this->error('参数缺失');
        }
        $model = new TravelModel();
        $info  = $model->getDetail(
            params: ['id' => $params['travel_id']],
        );
        if (!$info) {
            return $this->error('信息有误');
        }
        $pay_amount = bcmul($info['price'], $params['num'], 2);
        return $this->success('获取成功', [
            'info'  => $info,
            'order' => [
                'travel_id'  => $params['travel_id'],
                'pay_amount' => $pay_amount,
            ]
        ]);
    }

    public function apply()
    {
        $params = $this->request->param();
        if (empty($params['travel_id'])) {
            return $this->error('参数缺失');
        }
        if (empty($params['num'])) {
            return $this->error('参数缺失');
        }
        if (empty($params['name'])) {
            return $this->error('参数缺失');
        }
        if (empty($params['phone'])) {
            return $this->error('参数缺失');
        }
        $user_id = $this->auth->id;
        $model = new TravelModel();
        $info  = $model->getDetail(
            params: ['id' => $params['travel_id']],
        );
        if (!$info) {
            return $this->error('信息有误');
        }
        // 开始报名
        $data = [
            'travel_id'    => $info['travel_id'],
            'user_id'     => $user_id,
            'num'         => $params['num'],
            'name'        => $params['name'],
            'phone'       => $params['phone'],
            'order_no'    => createUniqueNo('T', $user_id),
            'pay_amount'  => bcmul($info['price'], $params['num'], 2),
            'status'      => 1,
            'create_time' => time()
        ];
        if (!Db::name('travel_order')->insertGetId($data)) {
            return $this->error('订单创建失败');
        }

        return $this->success('提交成功', [
            'order_no'   => $data['order_no'],
            'pay_amount' => $data['pay_amount'],
            'order_type' => 'travel_order',
        ]);
    }

    // 订单详情
    public function myApplyInfo()
    {
        $params  = $this->request->param();
        $user_id = $this->auth->id;

        $query = HotelOrderModel::with([
            'hotel' => function ($query) {
                $query->field(['id', 'name', 'image']);
            },
            'room'  => function ($query) {
                $query->field(['id', 'name', 'image', 'space', 'floor', 'is_wifi', 'window', 'breakfast', 'people_num', 'bad']);
            }
        ])->where('id', $params['id'])->where('user_id', $user_id);

        $info = $query->find();
        if ($info['status'] == 1) {
            if ($info['start_date'] > date('Y-m-d')) {
                $info['status_code'] = 1;
                $info['status_txt']  = '待入住';
            } else {
                $info['status_code'] = 2;
                $info['status_txt']  = '已入住';
            }
        } else {
            $info['status_code'] = 3;
            $info['status_txt']  = '已取消';
        }
        return $this->success('获取成功', $info);
    }

    // 订单取消
    public function applyCancel()
    {
        $params  = $this->request->param();
        $user_id = $this->auth->id;

        $order = HotelOrderModel::where('user_id', $user_id)->where('id', $params['order_id'])->where('status', 1)->find();
        if (!$order) {
            return $this->error('订单不存在或已取消');
        }
        if (time() > strtotime($order['start_date'] . ' 12:00:00')) {
            return $this->error('订单已入住,无法取消');
        }
        if (!HotelOrderModel::where('user_id', $user_id)->where('id', $params['order_id'])->where('status', 1)->update(['status' => 0])) {
            return $this->error('操作失败');
        }
        return $this->success('操作成功');
    }
}