<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Model\UserMainModel;
use App\Model\UserInfoModel;
use App\Model\UserCompanyModel;
use App\Model\OrderModel;
use App\Model\OrderPriceModel;
use App\Model\OrderInvoiceModel;
use App\Model\OrderActionLogModel;
use App\Model\PayLogModel;
use App\Model\UserSampleApplyModel;
use App\Model\UserSampleInviteModel;
use DB;
use Excel;
use Log;
use Exception;

class SpecialController extends Controller
{
    // 订单特殊处理,用于测试调整运费
    public function changeOrderPrice(Request $request)
    {
        $mobile = $request->input('mobile', '');
        $order_id = $request->input('order_id', '');

        if (!$mobile || !$order_id) {
            echo '参数缺失';die;
        }

        // 检查是否为测试账号
        $test_mobile = Config('params.test_mobile');

        if (!in_array($mobile, $test_mobile)) {
            echo '非测试账号';die;
        }

        DB::connection('order')->beginTransaction();

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

        if (!$order) {
            echo '运费不存在';die;
        }

        $data['price'] = 0;
        $update = DB::connection('order')->table('lie_order_price')->where('order_id', $order_id)->where('price_type', 3)->update($data);

        if (!$update) {
            DB::connection('order')->rollback();
            echo '运费更新失败';die;
        }

        $OrderModel = new OrderModel();
        $order_info = $OrderModel->find($order_id);

        $intracode = DB::table('lie_intracode')->where('user_id', $order_info['user_id'])->select('admin_id')->first();
        $sale_id = $intracode ? $intracode->admin_id : 0;

        // 操作记录
        $OrderActionLogModel = new OrderActionLogModel();
        $actionLog = $OrderActionLogModel->addLog($order_id, $sale_id, 2, '调整运费为0');

        if (!$actionLog) {
            DB::connection('order')->rollback();
            echo '添加运费更新日志失败';die;
        }

        DB::connection('order')->commit();

        echo '运费更新成功';
    }

    // 导出已离职人员数据 (业务ID、业务人、关联会员账号、公司名称)
    public function exportDimission() 
    {
        // 查找已离职人员
        $dimission = DB::table('user_info')->where('status', 4)->select('userId', 'name')->get();

        if (empty($dimission)) {
            echo '无离职人员';die;
        } 

        $sales = [];
        $sale_ids = [];

        foreach ($dimission as $v) {
            $sales[$v->userId] = $v->name;
            $sale_ids[] = $v->userId;
        }

        // 查找离职人员订单
        $OrderModel = new OrderModel();
        $order_info = $OrderModel->from('lie_order as o')
                        ->leftJoin('lie_user_main as u', 'o.user_id', '=', 'u.user_id')
                        ->leftJoin('lie_user_company as c', 'o.user_id', '=', 'c.user_id')
                        ->whereIn('o.sale_id', $sale_ids)
                        ->select('o.order_id', 'o.user_id', 'o.sale_id', 'u.mobile', 'u.email', 'c.com_name')
                        ->get();

        if (empty($order_info)) {
            echo '无离职人员订单';die;
        }

        $cellData = [];
        
        foreach ($order_info as $k=>$v) {
            $cellData[$k]['sale_id'] = $v['sale_id'];
            $cellData[$k]['sale_name'] = $sales[$v['sale_id']];
            $cellData[$k]['account'] = $v['mobile'] ? $v['mobile'] : $v['email'];
            $cellData[$k]['com_name'] = $v['com_name'];
        }

        $headerCell = ['业务ID', '业务员名称', '关联会员账号', '公司名称'];

        array_unshift($cellData, $headerCell);

        $fileName = '已离职人员关联客户'.date('_YmdHis');

        Excel::create($fileName, function($excel) use ($cellData){
            $excel->sheet('人员导出', function($sheet) use ($cellData){
                $sheet->rows($cellData);
            });
        })->export('xls');
    }

    // 导入离职业务客户
    public function importDimission(Request $request)
    {
        if ($request->isMethod('post')) {
            $file = $_FILES['file']; // $request->file('file')
            $filePath = $file['tmp_name']; // 临时路径

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

            if (!$excel) {
                echo '导入文件为空';die;
            }  

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

            $OrderModel = new OrderModel();      

            // 记录到日志
            $monolog = Log::getMonolog();
            $monolog->popHandler();
            Log::useDailyFiles(storage_path('logs/updateOrder.log'));

            foreach ($excel as $k=>$v) {
                if (!$v[0] || !$v[1]) continue;

                // 1. 根据手机或邮箱查找客户最近的订单
                $res = $this->getLastOrderId(trim($v[0]));

                if ($res['err_code'] != 0) {
                    Log::info('客户账号:'.$v[0].','.$res['err_msg']);
                    continue;
                }

                $order_id = $res['data'];

                // 2. 根据企业邮箱查找sale_id
                $sale_id = $this->getSaleId(trim(strtolower($v[1])));

                if ($sale_id === false) {
                    Log::info('客户账号:'.$v[0].',客服邮箱:'.$v[1].',没有找到跟进人邮箱');
                    continue;
                }

                // 3. 替换第一步的订单sale_id 
                $OrderModel->where('order_id', $order_id)->update(['sale_id' => $sale_id]);

                Log::info('客户账号:'.$v[0].',客服邮箱:'.$v[1].',替换已离职人员的订单,订单ID:'.$order_id.',之前的SALE ID:'.$sale_id);
            }

            echo '替换sale_id完成';die;
        }

        return view('importDimission');
    }

    // 获取客户最近的订单
    public function getLastOrderId($account)
    {
        $UserMainModel     = new UserMainModel();
        $UserCompanyModel  = new UserCompanyModel();
        $OrderModel        = new OrderModel();
        $OrderInvoiceModel = new OrderInvoiceModel();

        if (strpos($account, '@') !== false) { // 邮箱
            $where['email'] = strtolower($account);
            $user_info = $UserMainModel->where($where)->select('user_id')->orderBy('user_id', 'desc')->first();
        } else if (preg_match('/\d{11}/', $account)) { // 手机号码
            $where['mobile'] = $account;
            $user_info = $UserMainModel->where($where)->select('user_id')->orderBy('user_id', 'desc')->first();
        } else { // 公司名称
            // 发票抬头
            $order_invoice = $OrderInvoiceModel->where('tax_title', $account)->select('order_id')->orderBy('order_id', 'desc')->first();

            if ($order_invoice) return ['err_code' => 0, 'err_msg' => '', 'data' => $order_invoice['order_id']];
            
            $user_info = $UserCompanyModel->where('com_name', $account)->select('user_id')->orderBy('com_id', 'desc')->first();
        }   
        
        if (!$user_info) return ['err_code' => 1, 'err_msg' => '未找到客户'];

        // 查找最近的订单
        $order = $OrderModel->where('user_id', $user_info['user_id'])->where('is_type', 0)->select('order_id')->orderBy('order_id', 'desc')->first();

        if (!$order) return ['err_code' => 2, 'err_msg' => '未找到客户订单'];

        return ['err_code' => 0, 'err_msg' => '', 'data' => $order['order_id']];
    }

    // 获取后台业务ID
    public function getSaleId($email)
    {
        $user = DB::table('user_info')->where('email', $email)->select('userId')->first();

        if (!$user) return false;

        return $user->userId;
    }

    // 处理支付记录
    public function handlePayLog()
    {
//         $PayLogModel = new PayLogModel();
//         $pay_log = $PayLogModel->where('pay_type', 4)->where('is_paid', -1)->orderBy('create_time', 'desc')->get()->toArray();

//         $data = [];

//         foreach ($pay_log as $k=>$v) {
//             $log = $PayLogModel->where('order_id', $v['order_id'])->where('pay_type', 1)->first();

//             if (!$log) 
//                 continue;
            
//             // dump($log['order_id'].'==='.date('Y-m-d H:i:s', $log['create_time']).'==='.date('Y-m-d H:i:s', $log['pay_time']));    
                   
//             // $PayLogModel->where('pay_log_id', $v['pay_log_id'])->update(['is_paid'=>1, 'pay_time'=>$log['pay_time']]); // 更新账期支付
//             // $PayLogModel->where('pay_log_id', $log['pay_log_id'])->delete();

//             // // 记录到日志
//             // $monolog = Log::getMonolog();
//             // $monolog->popHandler();
//             // Log::useDailyFiles(storage_path('logs/update_pay_log.log'));
//             // Log::info('更新账期支付记录ID:'.$v['pay_log_id'].',删除的支付记录ID:'.$log['pay_log_id']);

//             $data[] = $log['pay_log_id'];
//         }
// dd($data);
    }

    // 自营预售订单改预付款
    public function changeOrderPayType(Request $request)
    {
        $order_id = $request->input('order_id', 0);

        if (!$order_id) return '订单ID不存在';

        DB::connection('order')->transaction(function() use ($order_id) {
            $OrderModel          = new OrderModel();
            $OrderPriceModel     = new OrderPriceModel();
            $PayLogModel         = new PayLogModel();
            $OrderActionLogModel = new OrderActionLogModel();

            // 查询订单信息
            $order_info = $OrderModel->find($order_id);

            if (!$order_info) throw new Exception("修改失败,订单不存在", 1);
            if ($order_info['status'] > 2) throw new Exception("修改失败,订单已支付", 1);

            $advance_amount = number_format($order_info['order_amount'] * 0.3, 2);

            // 订单表
            $order = array();
            $order['order_pay_type']   = 2; 
            $order['advance_amount']   = $advance_amount;
            $order['status']           = 3; 
            $order['advance_pay_time'] = time();

            $OrderModel->where('order_id', $order_id)->update($order);
            
            // 支付记录表
            $pay_log = array();
            $pay_log['order_id']    = $order_id;
            $pay_log['pay_id']      = 0; // 支付方式ID
            $pay_log['pay_name']    = '交通银行'; // 支付方式名
            $pay_log['pay_type']    = 2;
            $pay_log['pay_amount']  = $advance_amount;
            $pay_log['is_paid']     = 1;
            $pay_log['create_time'] = time();
            $pay_log['pay_time']    = time();

            $PayLogModel->insert($pay_log);

            // 价格表
            $price = array();
            $price['order_id']    = $order_id;
            $price['order_sn']    = '12019101531990';
            $price['price_type']  = -2; 
            $price['price']       = '-'.$advance_amount;
            $price['currency']    = $order_info['currency'];
            $price['create_time'] = time();

            $OrderPriceModel->insert($price);

            // 操作日志
            $OrderActionLogModel->addLog($order_id, 1000, 2, '手动调整订单支付类型');
        });   

        return '调整成功';
    }

    // 自营样片设置过期,剩余领取机会归零,不在领取表的用户默认1次领取机会
    public function setSampleExpire()
    {
        $UserInfoModel         = new UserInfoModel;
        $UserSampleApplyModel  = new UserSampleApplyModel;
        $UserSampleInviteModel = new UserSampleInviteModel;

        $res = $UserSampleApplyModel->where('is_expire', 1)->update(['is_expire' => -1]);
        dump($res);

        $res = $UserSampleInviteModel->where('is_expire', 1)->update(['is_expire' => -1]);
        dump($res);

        $user_ids = $UserSampleApplyModel->where('is_expire', -1)->groupBy('user_id')->lists('user_id')->toArray();

        if ($user_ids) {
            $res = $UserInfoModel->whereIn('user_id', $user_ids)->update(['apply_count' => 0]);
            dump($res);

            $res = $UserInfoModel->whereNotIn('user_id', $user_ids)->where('apply_count', '>', 1)->update(['apply_count' => 1]);
            dump($res);
        }
    }

}