<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use DB;
use Cookie;
use App\Http\Page;
use App\Http\Controllers\PermController;
use App\Http\Error;
use Excel;

Class AddOrderController extends Controller
{
	// 页面用户、菜单信息
    public function getPageInfo(Request $request)
    {
        $uri = '/' . $request->path();

        $username = $request->user->email;
        $useremail= $request->user->email;

        // 菜单
        $menuconfig = DB::table('config')->where('config_title', '订单系统')->first();
        $menus = [];
        if ($menuconfig && !($menus = json_decode($menuconfig->config_data)))
            $menus = [];

        $perm = new PermController;

        // 用户角色
        $role = $perm->getUserRole($request);

        // 获取权限菜单
        if ($role != 1) {
            $menus = $perm->getPermMenu($menus, $request->user->userId);   
        }

        $data = [
            'header'    => $request->user->header,
            'uri'       => $uri,
            'username'  => $username,
            'useremail' => $useremail,
            'menus'     => $menus,
        ];

        return $data;
    }

    // 新增联营订单
    public function addOrder(Request $request)
    {
        $info = $this->getPageInfo($request);

        $info['title'] = '新增联营订单';
        $info['sale_id'] = $request->user->userId;

        return view('addOrder', $info);
    }

    // 新增自营线上订单
    public function addOnline(Request $request)
    {
        $info = $this->getPageInfo($request);

        $info['title'] = '新增自营线上订单';
        $info['sale_id'] = $request->user->userId;

        return view('addOnline', $info);
    }

    // 新增自营其他业务订单
    public function addOtherOrder(Request $request)
    {
        $info = $this->getPageInfo($request);

        $info['title'] = '新增自营其他业务订单';
        $info['sale_id'] = $request->user->userId;

        return view('addOtherOrder', $info);
    }

    // 获取用户信息
    public function getUserInfo(Request $request)
    {
        if ($request->isMethod('post')) {
            $mobile = $request->input('mobile');

            if (preg_match('/@/', $mobile)) {
                $user = DB::connection('order')->table('lie_user_main')->where('email', $mobile)->select('user_id', 'email', 'is_test')->first();
            } else {
                $user = DB::connection('order')->table('lie_user_main')->where('mobile', $mobile)->select('user_id', 'mobile', 'is_test')->first();
            }      

            if (!empty($user)) {
                // 收货地址
                $address = DB::connection('order')->table('lie_user_address')->where('user_id', $user->user_id)->get();

                // 发票信息
                $invoice = DB::connection('order')->table('lie_taxinfo')->where('user_id', $user->user_id)->get();
                
                $info['user'] = $user;
                $info['address'] = $address;
                $info['invoice'] = $invoice;
            }           

            if (isset($info)) {
                return ['errcode' => 0, 'errmsg' => '', 'data' => $info];
            } else {
                return ['errcode' => -1, 'errmsg' => '未找用户信息'];
            }
        }
    }

    // 选择收货地址
    public function selectAddr(Request $request)
    {
        if ($request->isMethod('post')) {
            $address_id = $request->input('address_id');

            $address = DB::connection('order')->table('lie_user_address')->where('address_id', $address_id)->first();

            $address->province_val = $this->getAddress($address->province);
            $address->city_val = $this->getAddress($address->city);
            $address->district_val = $this->getAddress($address->district);

            return ['errcode' => 0, 'errmsg' => '', 'data' => $address];
        }
    }

    // 选择发票信息
    public function selectInv(Request $request)
    {
        if ($request->isMethod('post')) {
            $tax_id = $request->input('tax_id');

            $invoice = DB::connection('order')->table('lie_taxinfo')->where('tax_id', $tax_id)->first();

            $invoice->province_val = $invoice->consignee_province ? $this->getAddress($invoice->consignee_province) : '';
            $invoice->city_val = $invoice->consignee_city ? $this->getAddress($invoice->consignee_city) : '';
            $invoice->district_val = $invoice->consignee_district ? $this->getAddress($invoice->consignee_district) : '';

            return ['errcode' => 0, 'errmsg' => '', 'data' => $invoice];
        }
    }

    // 根据发票类型选择发票信息
    public function selectInvType(Request $request)
    {
        if ($request->isMethod('post')) {
            $user_id = $request->input('user_id');
            $inv_type = $request->input('inv_type');

            if ($inv_type == 3) {
                $invoice = DB::connection('order')->table('lie_taxinfo')->where(['user_id' => $user_id, 'inv_type' => $inv_type])->get();
            } else {
                $invoice = DB::connection('order')->table('lie_taxinfo')->where('user_id', $user_id)->whereIn('inv_type', [2, 4])->get();
            }
            
            return ['errcode' => 0, 'errmsg' => '', 'data' => $invoice];
        }
    }

    // 获取可用优惠券
    public function getCoupon(Request $request)
    {
        if ($request->isMethod('post')) {        
            $data['uid'] = $request->input('uid');
            $data['order_goods_type'] = $request->input('goods_type');
            $data['cart_ids'] = $request->input('cart_ids');        

            $data['k1'] = time();
            $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

            $url = Config('website.api_domain').'ucoupon/bestusebyordersystem';

            $response = json_decode(curlApi($url, $data), true); 

            if ($response['err_code'] == 0) {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg'], 'data'=>$response['data']];
            } else {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg']];
            }
        }
    }

    // 查询省市区
    public function getAddress($id)
    {
        $addr = DB::connection('order')->table('lie_region')->where('region_id', $id)->select('region_name')->first();

        return $addr ? $addr->region_name : '未匹配到ID:'.$id;
    }

	// 新增自营线下订单
    public function addOffline(Request $request) 
    {
        $info = $this->getPageInfo($request);

        $info['title'] = '新增自营线下订单';

        // 默认内部账号ID
        $internal = DB::connection('order')->table('lie_user_main')->where('mobile', Config('website.internal-account'))->select('user_id')->first();
        $info['internal_uid'] = $internal->user_id;

        // 默认内部账号收货地址
        $address = DB::connection('order')->table('lie_user_address')->where(['user_id' => $info['internal_uid'], 'is_default' => 1])->first();
        
        $address->province_val = $this->getAddress($address->province);
        $address->city_val = $this->getAddress($address->city);
        $address->district_val = $this->getAddress($address->district);
        
        $info['address'] = $address;

        $sale_id = $request->user->userId;
        $info['sale_id'] = $sale_id;

        // 当前登录用户名称
        $userInfo = DB::table('user_info')->where('userId', $sale_id)->select('name')->first(); 
        $info['name'] = $userInfo->name;

        // 当前登录用户内部绑定手机
        $intracode = DB::table('lie_intracode')->where('admin_id', $sale_id)->select('user_id')->first();

        if (!empty($intracode)) {
            $user = DB::connection('order')->table('lie_user_main')->where('user_id', $intracode->user_id)->select('mobile')->first();

            $info['mobile'] = $user ? $user->mobile : '';
        }

        return view('addOffline', $info);
    }  

    // 获取SKU信息
    public function getSku(Request $request)
    {
        if ($request->isMethod('post')) {
            $url = Config('website.search-skuid');
            $data['id'] = $request->input('sku_id');

            $data['k1'] = time();
            $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

            $response = json_decode(curlApi($url, $data, 'POST'), true); 

            if (!empty($response['data'])) {
                return ['errcode' => 0, 'errmsg' => '', 'data' => $response['data']];
            } else {
                return ['errcode' => -1, 'errmsg' => '未找SKU信息'];
            }
        }
    }

    // 添加到购物车
    public function addCart(Request $request)
    {
        if ($request->isMethod('post')) {        
            $data['uid'] = $request->input('uid');
            $data['id'] = $request->input('id');
            $data['num'] = $request->input('num');
            $data['buy'] = $request->input('buy');
            $data['delivery_place'] = $request->input('delivery_place');
            $data['type'] = 2; // 后台添加标记
            $data['pf'] = 4;

            $data['k1'] = time();
            $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

            $url = Config('website.api_domain').'cart/addByOrderSystem';

            $response = json_decode(curlApi($url, $data), true); 
        
            if ($response['err_code'] == 0) {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg'], 'data'=>$response['data']];
            } else {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg']];
            }
        }
    }

    // 切换销售类型
    public function switchSaleType(Request $request)
    {
        if ($request->isMethod('post')) {        
            $data['sale_type'] = $request->input('sale_type');
            $data['cart_ids'] = $request->input('cart_ids');

            $data['k1'] = time();
            $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

            $url = Config('website.api_domain').'cart/switchSaleType';

            $response = json_decode(curlApi($url, $data), true); 

            return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg']];
        }
    }

    // 获取购物车列表
    public function cartList(Request $request)
    {
        if ($request->isMethod('post')) {        
            $data['uid'] = $request->input('uid');
            $data['type'] = $request->input('type');
            $data['delivery_place'] = $request->input('delivery_place');

            $data['k1'] = time();
            $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

            $url = Config('website.api_domain').'cart/listsByOrderSystem';

            $response = json_decode(curlApi($url, $data), true); 
         
            if ($response['err_code'] == 0) {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg'], 'data'=>$response['data']];
            } else {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg']];
            }
        }
    }

    // 修改购物车商品数量
    public function changeNum(Request $request)
    {
        if ($request->isMethod('post')) {        
            $data['uid'] = $request->input('uid');
            $data['num'] = $request->input('num');
            $data['cart_id'] = $request->input('cart_id');
            $type = $request->input('type'); // 3-批量添加的商品
            $goods_type = $request->input('goods_type');

            $data['k1'] = time();
            $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

            if ($type == 3 && $goods_type == 1) { // 联营批量添加
                $url = Config('website.api_domain').'cart/changeNumForJoint';
            } else {
                $url = Config('website.api_domain').'cart/changeNumByOrderSystem';
            }    

            $response = json_decode(curlApi($url, $data), true); 
            
            if ($response['err_code'] == 0) {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg'], 'data'=>$response['data']];
            } else {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg']];
            }            
        }
    }

    // 删除购物车商品
    public function deleteGoods(Request $request)
    {
        if ($request->isMethod('post')) {        
            $data['uid'] = $request->input('uid');
            $data['cart_id'] = $request->input('cart_id');

            $data['k1'] = time();
            $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

            $url = Config('website.api_domain').'cart/deleteByOrderSystem';

            $response = json_decode(curlApi($url, $data), true); 
            
            if ($response['err_code'] == 0) {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg'], 'data'=>$response['data']];
            } else {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg']];
            }            
        }
    }

    // 确认订单信息
    public function confirm(Request $request) 
    {
        if ($request->isMethod('post')) {  
            $is_online = $request->input('is_online');
            $data['uid'] = $request->input('uid', 0);
            $data['address_id'] = $request->input('address_id', 0);
            $data['cart_id'] = $request->input('cart_ids', '');
            $data['user_coupon_id'] = $request->input('user_coupon_id', 0);
            if ($is_online == 0) {
                $data['type'] = 3; // 自营线下
            } else if ($is_online == 2) {
                $data['type'] = 4; // 自营其他业务
                $data['business_type'] = $request->input('business_type', 0); // 业务类型
            } else {
                $data['type'] = $request->input('goods_type');
            }
            
            $data['k1'] = time();
            $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

            $url = Config('website.api_domain').'cart/confirm';

            $response = json_decode(curlApi($url, $data), true); 
          
            if ($response['err_code'] == 0) {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg'], 'data'=>$response['data']];
            } else {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg']];
            }            
        }
    }

    // 检查期货库存
    public function checkStock(Request $request)
    {
        if ($request->isMethod('post')) {  
            $cart_info = json_decode($request->input('cart_info', ''), true);
            $sale_type = $request->input('sale_type', 1);

            $data['k1'] = time();
            $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

            $url = Config('website.api_domain').'goods/detail';

            $warning_arr = array();

            foreach ($cart_info as $k=>$v) {
                $data['id'] = $v['gid'];

                $response = json_decode(curlApi($url, $data), true); 

                if ($sale_type == 1) {
                    // 现货订单--判断下单数量是否大于库存,若大于则弹出提示信息
                    if ($v['num'] > $response['data']['goods_number']) {
                        $temp['goods_name'] = $response['data']['goods_name']; // 型号
                        $temp['stock'] = $response['data']['goods_number']; // 可用库存
                        $warning_arr[] = $temp;
                        $errmsg = '库存不足,建议设置为期货类型';
                    } 
                } else {
                    // 期货订单--判断下单数量是否小于库存,若小于则弹出提示信息
                    if ($v['num'] < $response['data']['goods_number']) {
                        $temp['goods_name'] = $response['data']['goods_name']; // 型号
                        $temp['stock'] = $response['data']['goods_number']; // 可用库存
                        $warning_arr[] = $temp;
                        $errmsg = '您提交的数量有实际库存,建议直接购买现货';
                    } 
                }
            }

            if (!empty($warning_arr)) {
                return ['errcode' => -1, 'errmsg' => $errmsg, 'data'=>json_encode($warning_arr)];
            }
            
            return ['errcode' => 0, 'errmsg' => ''];           
        }
    }

    // 提交订单
    public function create(Request $request)
    {
        if ($request->isMethod('post')) {        
            $data['uid'] = $request->input('uid');
            $data['sale_id'] = $request->input('sale_id');
            $data['address_id'] = $request->input('address_id');
            $data['cart_id'] = implode(',', $request->input('cart_ids'));
            $data['type'] = $request->input('type');
            $data['remark'] = $request->input('remark');

            if ($data['type'] == 3) { // 自营线下订单
                $data['address_name'] = $request->input('address_name');
                $data['address_mobile'] = $request->input('address_mobile');
            } else { // 联营、自营线上订单
                $data['tax_id'] = $request->input('tax_id');
                $data['user_coupon_id'] = $request->input('user_coupon_id');

                if ($data['type'] == 4) {
                    $data['business_type'] = $request->input('business_type');
                }
            }

            $data['sale_type'] = $request->input('sale_type', ''); // 自营线上选择销售类型

            $data['k1'] = time();
            $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

            $url = Config('website.api_domain').'order/create';

            $response = json_decode(curlApi($url, $data), true); 
            
            if ($response['err_code'] == 0) {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg'], 'data'=>['order_id' => $response['data'], 'type' => $data['type']]];
            } else {
                return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg']];
            }            
        }
    }

    // 提交订单成功页面
    public function success(Request $request)
    {
        $info = $this->getPageInfo($request);

        $order_id = $request->input('order_id');
        $type = $request->input('type');

        switch ($type) {
            case 1: $title = '新增联营订单'; break;
            case 2: $title = '新增自营线上订单'; break;
            case 3: $title = '新增自营线下订单'; break;
            case 4: $title = '新增自营其他业务订单'; break;
        }

        $info['title'] = $title;
        $info['paths'] = [["title" => $title, "href" => '#']];
        $info['type'] = $type;

        $order = DB::connection('order')->table('lie_order')->where('order_id', $order_id)->first();

        if ($type != 3) {
            $user = DB::connection('order')->table('lie_user_main')->where('user_id', $order->user_id)->select('mobile')->first();
            $info['user_info'] = $user;
        }

        $info['order_info'] = $order;  

        return view('success', $info);
    }

    // 自营线下订单审核
    public function selfCheck(Request $request)
    {
        if ($request->isMethod('post')) {        
            $order_id = $request->input('order_id');
            $status = $request->input('status');

            // 审核通过推到WMS
            if ($status == 4) {
                $data['order_id'] = $order_id;
                $data['k1'] = time();
                $data['k2'] = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

                $url = Config('website.api_domain').'order/wmsOrder';

                $response = json_decode(curlApi($url, $data), true); 

                if ($response['err_code'] == 0) {
                    $orderInfo = DB::connection('order')->table('lie_order')->where('order_id', $order_id)->first();

                    DB::beginTransaction();
                    try {
                        // 插入到order_price
                        $price['order_id'] = $order_id;
                        $price['order_sn'] = $orderInfo->order_sn;
                        $price['price_type'] = -1;
                        $price['price'] = '-'.$orderInfo->order_amount;
                        $price['create_time'] = time();

                        $priceAdd = DB::connection('order')->table('lie_order_price')->insert($price);

                        // 添加付款记录
                        $pay['user_id'] = $orderInfo->user_id; 
                        $pay['order_id'] = $order_id; 
                        $pay['order_sn'] = $orderInfo->order_sn; 
                        $pay['pay_id'] = 0; // 支付方式ID
                        $pay['pay_name'] = '交通银行'; // 支付方式名
                        $pay['pay_type'] = 1;
                        $pay['pay_amount'] = $orderInfo->order_amount;
                        $pay['is_paid'] = 1;
                        $pay['create_time'] = time();
                        $pay['pay_time'] = time();

                        $payLog = DB::connection('order')->table('lie_pay_log')->insert($pay);

                        // 待发货状态
                        $update = DB::connection('order')->table('lie_order')->where('order_id', $order_id)->update(['status' => $status, 'pay_time' => time(), 'wms_syn' => 1]);

                        if ($update && $priceAdd && $payLog) {
                            DB::commit();
                        }
                    } catch (Exception $e) {
                        DB::rollBack();
                    }   
                } else {
                    return ['errcode' => $response['err_code'], 'errmsg' => $response['err_msg']];
                }

                $event = '自营线下订单审核通过';
            } else {
                $data['order_id'] = $request->input('order_id');
                $data['operator_id'] = $request->user->userId;
                $data['type'] = 3;

                $url = Config('website.api_domain').'order/cancel';

                $data['k1']  = time();
                $data['k2']  = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

                $temp = json_decode(curlApi($url, $data, "POST"), true);

                $event = '自营线下订单审核不通过';

                return array('errcode'=>$temp['err_code'],'errmsg'=>$temp['err_msg']);
            }  
            
            // 操作记录
            $log['order_id'] = $order_id;
            $log['operator_id'] = $request->user->userId;
            $log['operator_type'] = 2;
            $log['event'] = $event;
            $log['ip'] = get_client_ip();
            $log['create_time'] = time();
            $actionLog = DB::connection('order')->table('lie_order_action_log')->insert($log);

            if (!$actionLog){
                errorLog(Error::E_ADD_FAILED, '添加操作记录失败');
                return ['errcode'=>Error::E_ADD_FAILED, 'errmsg'=>'添加操作记录失败'];
            } 

            if (!empty($update)) {
                return ['errcode' => 0, 'errmsg' => '操作成功'];
            } else {
                return ['errcode' => -1, 'errmsg' => '操作失败'];
            }            
        }
    }

    // 商品批量导入
    public function batchGoodsImport(Request $request)
    {
        $file = $_FILES['file']; // $request->file('file')
        $filePath = $file['tmp_name']; // 临时路径

        // 获取导入内容
        $excel = [];
        Excel::load($filePath, function($reader) use(&$excel){
            $data = $reader->getSheet(0);
            $excel = $data->toArray();
        });

        $type = $request->input('type'); // 1.联营 2.自营

        if ($type == 1) {
            $map = Config('params.joint_map');
            $type_val = '联营';
        } else {
            $map = Config('params.self_map');
            $type_val = '自营';
        }

        if (count($map) != count($excel[0])) {
            errorLog(Error::E_IMPORT_TEMP_ERR, '导入模板错误,需导入'.$type_val.'模板');
            return ['errcode' => 1, 'errmsg' => '导入模板错误,需导入'.$type_val.'模板'];
        }

        // 验证excel内容
        $valid = $this->excelValid($excel); 

        if ($valid['errcode'] != 0) {
            errorLog(Error::E_IMPORT_VALID_FAILED, $valid['errmsg']);
            return $valid;
        }

        array_shift($excel); // 删除第一行

        $goods_info = $this->handleData($excel, $map); // 处理数据

        // 推送到API
        $data['data'] = $goods_info;
        $data['operator_id'] = $request->user->userId;
        $data['type'] = 3; // 后台批量添加标记
        $data['uid'] = $request->input('user_id'); 
        $data['delivery_place'] = $request->input('delivery_place'); 

        if ($type == 1) { // 联营
            $url = Config('website.api_domain').'cart/addBatchByOrderSystem';
        } else {
            $url = Config('website.api_domain').'cart/addBatch';
        }
        
        $data['k1']  = time();
        $data['k2']  = md5(md5($data['k1']).'fh6y5t4rr351d2c3bryi');

        $temp = json_decode(curlApi($url, $data, "POST"), true);

        return ['errcode' => $temp['err_code'], 'errmsg' => $temp['err_msg']];
    }

    // 验证导入excel
    public function excelValid($excel)
    {
        $count = count($excel);

        if ($count == 1) return ['errcode' => 1, 'errmsg' => '未填写物料信息'];

        // 获取excel菜单栏必填项
        $required = array_filter($excel[0], function($v) {
            return strpos($v, '*') === false ? false : true;
        });

        $required_keys = array_keys($required); // 必填项keys   

        $err = ['errcode' => 0, 'errmsg' => '验证成功']; // 提示信息
        array_walk($excel, function($val, $key) use($required, $required_keys, &$err) {
            // 跳过第一条
            if ($key != 0) {
                foreach ($val as $k=>$v) {
                    if (in_array($k, $required_keys)) {
                        if (empty($v)) { // 若必填项值为空,返回提示信息
                            $err = ['errcode' => 1, 'errmsg' => $required[$k].'列,第'.$key.'行不能为空']; 
                            break;
                        }
                    }
                } 
            }
        });
        
        return $err;
    }

    // 处理导入内容---赋上字段
    public function handleData($excel, $map)
    {
        $goods_info = array_map(function($val) use($map) {
            foreach ($val as $k=>$v) {
                $tmp[$map[$k]] = $v;
            }

            return $tmp;
        }, $excel);

        return $goods_info;
    }
}