<?php

namespace App\Http\Controllers\API\H5;

use App\Http\Controllers\Controller;
use App\Http\Controllers\API\PEISApiController;
use App\Services\ConfigService;
use DateTime;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class OrderController extends Controller
{
  public function list(Request $request)
  {
    // status 1-待支付 2-已预约 3-交易关闭 4-已完成 5-已退款
    $openid = $request->post('openid');
    $user = DB::table('web_users')->where(['openid' => $openid, 'is_del' => 0])->first();
    if (!$user) return \Yz::echoError1("openid对应用户不存在");
    $OrderList = DB::table('orders')
      ->select('id', 'title', 'status', 'name', 'appointment_time as time', 'order_number as order',
        DB::raw("CASE WHEN type = 1 THEN '个检' WHEN type = 2 THEN '团检' ELSE 'unknown' END as type"),
        'price', 'true_price', 'pay_time', 'refund_time', 'created_at')
      ->where(['web_user_id' => $user->id])->get();
    $WaitingPaymentTime = config('app.globals.WaitingPaymentTime');//支付等待時間
    foreach ($OrderList as $key => $list) {
      if ($list->status == 1) {
        $datetime = new DateTime($list->created_at);
        $timestamp = $datetime->getTimestamp();
        $list->end_time = $timestamp + (60 * $WaitingPaymentTime);
      }
    }

    return \Yz::Return(true, '获取成功', [
      'list' => $OrderList
    ]);
  }
  public function GetDetail()
  {
    $id = request('id');
    $order_info = DB::table('orders')->where(['id' => $id])->first();
    return \Yz::Return(true, '获取成功', [
      'info' => $order_info
    ]);
  }

  //创建订单
  public function Create()
  {
    $hospital_id = request('hospital');
    $openid = request('openid');
    $person_id = request('person_id');
    $combo_id = request('combo_id');
    $type = request('type');//1个检2团检
    $group_id = request('group_id');//团检id
    $item_ids = request('item_ids');//自选item的ids
    $plan_id = request('plan_id');//号源id
    $plan_nmr_id = request('plan_nmr_id');//核磁号源id
    $doctor = request('doctor');//预约的医生名字

    if (!isset($hospital_id)) return \Yz::echoError1('医院id不能为空');
    if (!isset($openid)) return \Yz::echoError1('openid不能为空');
    if (!isset($person_id)) return \Yz::echoError1('person_id不能为空');
    if (!isset($type)) return \Yz::echoError1('type体检类型不能为空');
    if ($type != 1 && $type != 2) {
      return \Yz::echoError1('type参数，体检类型错误');
    }
    if (!isset($plan_id)) return \Yz::echoError1('号源id不能为空');
    if ($type == 2 and !isset($group_id)) return \Yz::echoError1('团检，group_id不能为空');
    if ($type == 1 and isset($group_id)) return \Yz::echoError1('体检类型:个检 与group_id冲突');

    $user = DB::table('web_users')->where(['openid' => $openid, 'status' => 1, 'is_del' => 0])->first();
    if (!$user) return \Yz::echoError1('用户不存在');
    $person = DB::table('web_user_person')->where(['id' => $person_id, 'is_del' => 0])->first();
    if (!$person) return \Yz::echoError1('体检人不存在');
    $title = "自选项目";
    $price = 0;
    $true_price = 0;//订单真实支付金额
    $buy_info = [
      'combo' => [
        'id' => 0,
        'name' => $title,
        'price' => 0,
      ],
      'items' => [],
      'group' => [
        'id' => '',
      ],
    ];
    //如果是套餐
    $checkup_type_id = false; //体检类型id
    if (isset($combo_id) and $combo_id <> 0) {
      $combo_info = DB::table('combos')->where(['combo_id' => $combo_id, 'status' => 1])->first();
      if (!$combo_info) return \Yz::echoError1("套餐不存在");
      if (!isset($combo_info->checkup_type_id)) return \Yz::echoError1("套餐未关联体检类型");
      $checkup_type_id = $combo_info->checkup_type_id;
      $price += $combo_info->price;
      $title = $combo_info->name;
      $buy_info['combo'] = [
        'id' => $combo_info->combo_id,
        'name' => $combo_info->name,
        'price' => $combo_info->price,
      ];
    }

    //如果有自选项目
    $items_list = [];
    if (count($item_ids) != 0) {
      $items_list = DB::table('items')->whereIn('item_id', $item_ids)->where(['status' => 1])->get();
      $existingIds = [];
      foreach ($items_list as $item) {
        $price += $item->price;
        $existingIds[] = $item->item_id;
        $buy_info['items'][] = [
          'id' => $item->item_id,
          'name' => $item->name,
          'price' => $item->price
        ];
      }
      $missingIds = array_diff($item_ids, $existingIds);
      if (count($missingIds) > 0) return \Yz::echoError1("部分自选项目不可用，Id:" . implode(', ', $missingIds));
    }
    $true_price = $price;
    //如果是团检
    $group_info = false;
    if ($type == 2) {
      $P = new PersonController();
      $data = [
        '电话号码' => null,
        '证件号码' => null,
        '预约Id' => $group_id
      ];
      $group_info = $P->group_info($hospital_id, $data);
      $group_info = $group_info[0];
      $buy_info['group'] = [
        'id' => $group_id,
        'combo_name' => $group_info['combo_name'],
        'combo_id' => $group_info['combo_id'],
        'group_name' => $group_info['group_name'],
        'items' => $group_info['items'],
        'group_id' => $group_info['group_id'],
      ];
      $title = "单位团检" . $group_info['combo_name'];
      $price = $price + $group_info['sixi_zong_ji_jin_e'];
      $need_pay = ($price - $group_info['tongshou_xiane']) > 0 ? $price - $group_info['tongshou_xiane'] : 0;
      //团检订单金额为减去统收后的金的
      $price = $need_pay;
      $true_price = $need_pay;
    }

    //调用思信接口判断各个项目是否可用
    $check_items = [];
    foreach ($item_ids as $item_id) {
      $check_items[] = ['Id' => $item_id];
    }
    if ((isset($combo_id) and $combo_id <> 0) || count($check_items) != 0) {
      $item_check = self::item_check($hospital_id, [
        '人员信息列表' => [[
          "序号" => 0,
          "性别" => $person->sex == 1 ? '男' : '女',
          "年龄" => floor((time() - strtotime($person->birthday)) / 86400 / 360),
          "婚姻状态" => $person->married == 1 ? '已婚' : '未婚',
        ]],
        '套餐Id' => $combo_id == 0 ? null : $combo_id,
        '可选项目信息' => $check_items,
      ]);
      if (count($item_check['data']) != 1) {
        return \Yz::echoError1("体检系统提示：" . $item_check['message']);
      }
    }

    //检查号源是否可用
    $plan = new PlanController();
    $plan_check = $plan->CheckPlan($plan_id, $hospital_id, $type, $person->sex, $price, $checkup_type_id);
    if ($plan_check['status'] === false) return \Yz::echoError1($plan_check['msg']);
    $plan = $plan_check['plan'];

    //判断号源是否可用vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//    $plan = DB::table('plans')->where(['id' => $plan_id, 'hospital_id' => $hospital_id, 'status' => 1, 'is_del' => 0])->first();
//    if (!$plan) return \Yz::echoError1("号源不可用");
//    //判断个检/团检类型
//    if ($plan->use_type <> 0 and $plan->use_type <> $type) {
//      $type_temp = '';
//      if ($plan->use_type == 1) $type_temp = '个检';
//      if ($plan->use_type == 2) $type_temp = '团检';
//      return \Yz::echoError1("此号源为" . $type_temp . "号源，不可用");
//    }
//    //判断是否是预留号源
//    if ($plan->type <> 1) return \Yz::echoError1("此号源为预留号源，不可用");
//    //判断是否是vip
//    //判断性别
//    if ($plan->sex <> 0 and $plan->sex <> $person->sex) return \Yz::echoError1("此号源性别与体检人性别不符，不可用");
//    //判断体检类型checkup_type
//    //判断金额
//    if ($plan->use_type == 1 and $plan->amount_limit1 <> 0) {
//      if ($price < $plan->amount_limit1) return \Yz::echoError1("未达到此号源限制的金额，不可用");
//    }
//    if ($plan->use_type == 2 and $plan->amount_limit2 <> 0) {
//      if ($price < $plan->amount_limit2) return \Yz::echoError1("未达到此号源限制的金额，不可用");
//    }
//    //判断时间是否过期
//    $plan_datetime = $plan->date . ' ' . $plan->time;
//    if ($plan_datetime < date('Y-m-d H:i:s')) return \Yz::echoError1("号源已过期，不可用");
    //判断号源是否可用^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    //如果是团检 判断号源在 团检登记人的有效时间范围内
    $plan_datetime = $plan->date . ' ' . $plan->time;
    if (!!$group_info) {
      if (!($plan_datetime > $group_info['start_time'] . ' 00:00:00' and $plan_datetime < $group_info['end_time'] . ' 23:59:59')) {
        return \Yz::echoError1("预约日期不在单位有效时间范围内，请重新选择");
      }
    }


    //构建订单号
    $order_num = $this->generateOrderNumber();
    $data = [
      'title' => $title,
      'type' => $type,
      'web_user_id' => $user->id,
      'person_id' => $person->id,
      'name' => $person->name,
      'id_number' => $person->id_number,
      'buy_info' => json_encode($buy_info, JSON_UNESCAPED_UNICODE),
      'price' => $price,
      'true_price' => $true_price,
      'order_number' => $order_num,
      'status' => 1,
      'appointment_date' => $plan->date,
      'appointment_time' => $plan->time,
      'plan_id' => $plan->id,
      'plan_number' => $plan->plan_number,
      'combo_id' => $combo_id,
      'hospital_id' => $hospital_id,
      'doctor' => $doctor,
      'phone' => $person->phone,
      'sex' => $person->sex,
      'birthday' => $person->birthday,
      'married' => $person->married,
    ];
    DB::beginTransaction();
    $insert = DB::table('orders')->insertGetId($data);
    $up_plan = DB::table('plans')->where(['id' => $plan->id, 'status' => 1])->update([
      'status' => 2
    ]);
    if ($insert and $up_plan) {
      DB::commit();
      $action=false;
      if($true_price===0){
        //如果是免费的，直接去预约
        $yuyue=  self::Finish($order_num);
        if($yuyue['status']===true){
          return \Yz::return(true, "操作成功", ['action' => $action,'orderid'=>$insert]);
        }else{
          return \Yz::echoError1($yuyue['msg']);
        }
      }
      if($true_price>0){
        //如果大于0则提示前端去支付
        $action="pay";
      }
      return \Yz::return(true, "操作成功", ['action' => $action,'orderid'=>$insert]);
    } else {
      DB::rollBack();
      return \Yz::echoError1('操作失败');
    }
  }

  public function generateOrderNumber()
  {
    // 获取当前时间的时间戳（精确到毫秒）
    $timestamp = round(microtime(true) * 1000);

    // 生成一个随机数（可以根据需要调整长度）
    $randomPart = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 6);

    // 拼接时间戳和随机部分
    $orderNumber = date("YmdHis", $timestamp / 1000) . substr($timestamp % 1000, -3) . $randomPart;

    return $orderNumber;
  }

  public function item_check($hospital, $data)
  {
    $peis = new PEISApiController();
    $check = $peis::Post('套餐项目检查', $hospital, $data);
    return $check;
  }


  public function Finish_test()  //删除！！！
  {
    $f=self::Finish('20240916154519911MbHwIE');
    dd($f);
  }

  //最后步骤，开始通知思信预约
  public function Finish($order_number)
  {
    $order_info = DB::table('orders')->where(['order_number' => $order_number])->first();
    if (!$order_info) return ['status' => false, 'msg' => "未找到有效订单。"];
    $buy_info = json_decode($order_info->buy_info, true);
    $combo_id = $buy_info['combo']['id'];
    $item_arr = [];
    foreach ($buy_info['items'] as $item) {
      $item_arr[] = ['Id' => $item['id'], '已收费' => true];
    }
    //调用思信 套餐项目检查
    if ((isset($combo_id) and $combo_id <> 0) || count($item_arr) != 0) {
      $item_check = self::item_check($order_info->hospital_id, [
        '人员信息列表' => [[
          "序号" => 0,
          "性别" => $order_info->sex == 1 ? '男' : '女',
          "年龄" => floor((time() - strtotime($order_info->birthday)) / 86400 / 360),
          "婚姻状态" => $order_info->married == 1 ? '已婚' : '未婚',
        ]],
        '套餐Id' => $combo_id == 0 ? null : $combo_id,
        '可选项目信息' => $item_arr,
      ]);
      if (count($item_check['data']) != 1) {
        return ['status' => false, 'msg' => "体检系统提示：" . $item_check['message']];
      }
    }
    //如果是个检
    if ($order_info->type == 1) {
      $cad = [
        'type' => 1,
        "姓名" => $order_info->name,
        "性别" => $order_info->sex == 1 ? '男' : '女',
        "年龄" => floor((time() - strtotime($order_info->birthday)) / 86400 / 360),
        "婚姻状态" => $order_info->married == 1 ? '已婚' : '未婚',
        "证件号码" => $order_info->id_number,
        "电话号码" => $order_info->phone,
        "预约时间" => $order_info->appointment_date . ' ' . $order_info->appointment_time,
        "介绍人" => $order_info->referral,
        '套餐Id' => $order_info->combo_id == 0 ? null : $order_info->combo_id,
        "可选项目信息" => $item_arr,
        "已收费" => true,
        "总计金额" => $order_info->price,
      ];
    } else {
      $cad = [
        'type' => 2,
        "预约Id" => $buy_info['group']['group_id'],
        "预约时间" => $order_info->appointment_date . ' ' . $order_info->appointment_time,
        '套餐Id' => null,
        "可选项目信息" => $item_arr
      ];
    }
    //如果是 如果订单未支付 在这里更新订单状态为已支付。
    DB::table('orders')->where(['order_number' => $order_number,'status'=>1])->update([
      'status' => 2,
      'pay_time' => date('Y-m-d H:i:s'),
    ]);
    //查询确认订单已经是支付状态
    $cha=DB::table('orders')->where(['order_number' => $order_number,'status'=>2])->first();
    if(!$cha) return ['status' => false, 'msg' => "订单未支付，禁止预约"];
    //把状态更新为支付后，然后再开始预约思信
    $create_appointment = self::create_appointment($order_info->hospital_id, $cad);

    if(!isset($create_appointment['data'][0][0])) return ['status' => false, 'msg' => "体检预约，返回非预期结果"];

    //预约完成后查询预约结果
    $appointment_info = self::appointment_info($order_info->hospital_id, [
      'type' => $order_info->type,
      "证件号码" => null,
      "电话号码" => null,
      "预约Id" => $create_appointment['data'][0][0],
    ]);
    DB::table('orders')->where(['order_number' => $order_number])->update([
      'appointment_number' =>  $create_appointment['data'][0][0],
      'appointment_back_info'=> json_encode($appointment_info['data'][0], JSON_UNESCAPED_UNICODE)
    ]);
    return  ['status' => true, 'msg' => "完成"];
  }
  public function create_appointment($hospital, $data)
  {
    $peis = new PEISApiController();
    $url_code = $data['type'] == 1 ? '个检预约' : '团检预约';
    unset($data['type']);
    $info = $peis::Post($url_code, $hospital, $data);
    return $info;
  }
  public function appointment_info($hospital, $data)
  {
    $peis = new PEISApiController();
    $url_code = $data['type'] == 1 ? '个检预约查询' : '团检预约查询';
    unset($data['type']);
    $info = $peis::Post($url_code, $hospital, $data);
    return $info;
  }
  public function cancel_appointment($hospital, $data)
  {
    $peis = new PEISApiController();
    $url_code = $data['type'] == 1 ? '个检预约取消' : '团检预约取消';
    unset($data['type']);
    $info = $peis::Post($url_code, $hospital, $data);
    return $info;
  }
}
