<?php


namespace App\Http\Services;

use App\Http\Validators\SupplierValidator;
use App\Model\LogModel;
use App\Model\SupplierChannelModel;
use App\Model\SupplierContactModel;

class SupplierAuditService
{
    public function auditSupplier($supplierId, $status, $rejectReason)
    {
        $model = new SupplierChannelModel();

        //先找出原来供应商的状态
        $supplierModel = new SupplierChannelModel();
        $supplier = $supplierModel->where('supplier_id', $supplierId)->first()->toArray();
        //如果需要复审并且审核状态为审核中,则代表这次审核为第一次审核或者供应商类型从临时修改为正式
        if ($supplier['status'] == SupplierChannelModel::STATUS_IN_REVIEW && $supplier['need_review'] == 1) {
            //第一次审核,通过是将审核状态置为待复审
            //通过
            if ($status == SupplierChannelModel::STATUS_PASSED) {
                $dbStatus = SupplierChannelModel::STATUS_NEED_REVIEW;
            } else {
                //不通过
                $dbStatus = $status;
            }
            $update = [
                'update_time' => time(),
                'status' => $dbStatus,
                'reject_reason' => $rejectReason,
            ];
            $result = $model->where('supplier_id', $supplierId)->update($update);

            //如果是待复审状态,通过的话还要将是否需要复审状态置为0
        } elseif ($supplier['status'] === SupplierChannelModel::STATUS_NEED_REVIEW) {
            if ($status == SupplierChannelModel::STATUS_PASSED) {
                $result = $model->where('supplier_id', $supplierId)->update([
                    'update_time' => time(),
                    'status' => $status,
                    'reject_reason' => $rejectReason,
                    'need_review' => 0,
                ]);
                $supplier['need_review'] = 0;
            } else {
                $result = $model->where('supplier_id', $supplierId)->update([
                    'update_time' => time(),
                    'status' => $status,
                    'reject_reason' => $rejectReason,
                ]);
            }
            //剩下的就是普通的审核
        } else {
            $result = $model->where('supplier_id', $supplierId)->update([
                'update_time' => time(),
                'status' => $status,
                'reject_reason' => $rejectReason,
            ]);
        }

        $action = '审核供应商';
        if ($result) {
            //如果状态是复审
            if ($supplier['status'] == SupplierChannelModel::STATUS_NEED_REVIEW) {
                $auditStatus = $status == SupplierChannelModel::STATUS_PASSED ? '复审通过 ' . $rejectReason : '复审不通过,原因是 : ' . $rejectReason;
                $action = '复审供应商';
            } else {
                $auditStatus = $status == SupplierChannelModel::STATUS_PASSED ? '审核通过 ' . $rejectReason : '审核不通过,原因是 : ' . $rejectReason;
            }
            $logService = new LogService();
            $content = $auditStatus;
            $logService->AddLog($supplierId, LogModel::UPDATE_OPERATE, $action, $content);
        }

        //复审通过状态的供应商才会同步到金蝶
        if ($supplier['need_review'] == 0) {
            //发送队列消息同步到金蝶
            $service = new SyncSupplierService();
            $service->syncSupplierToErp($supplierId);
            if ($status == SupplierChannelModel::STATUS_PASSED) {
                if (!checkPerm('IgnoreCompanyCheck')) {
                    //判断有公司信息才允许同步给一体化
                    $regionType = $supplier['region'] == SupplierChannelModel::REGION_CN ? 1 : 2;
                    if ($regionType == 2) {
                        (new SyncSupplierService())->syncSupplierToUnited($supplierId);
                    } else {
                        $supplier['tax_number'] = $supplier['supplier_name'] ?: $supplier['tax_number'];
                        $company = (new CompanyService())->getCompanyInfo($supplier['supplier_name'],
                            $supplier['tax_number'], $regionType);
                        if (!empty($company)) {
                            if (!empty($company['tax_number'])) {
                                SupplierChannelModel::where('supplier_id', $supplierId)->update([
                                    'tax_number' => $company['tax_number'],
                                ]);
                            }
                            //同步给一体化系统
                            (new SyncSupplierService())->syncSupplierToUnited($supplierId);
                        }
                    }
                } else {
                    (new SyncSupplierService())->syncSupplierToUnited($supplierId);
                }
            }
        }
        return $result;
    }

    public function CheckCanApplyInReview($supplierIds)
    {
        foreach ($supplierIds as $supplierId) {
            $supplier = SupplierChannelModel::where('supplier_id', $supplierId)->first()->toArray();
            //要将部分字段从0改成'',要不然表单验证会有问题
            $needChangeField = [
                'pay_type',
                'currency',
                'supplier_group',
                'supplier_type',
                'settlement_type',
            ];
            foreach ($supplier as $key => &$value) {
                if (in_array($key, $needChangeField) && empty($value)) {
                    $value = '';
                }
            }
            unset($value);
            $validator = new SupplierValidator();
            return $validator->checkSave($supplier, true);
        }
    }

    //判断是否是可以由当前用户审核
    //要判断审核供应商的最后修改人,是不是属于当前审批人的部门或者部下,是才能让他审核
    public function CheckCanAuditSupplier($supplierId)
    {
        //忽略上面所说的限制(权限)
        if (checkPerm('IgnoreAuditCheck')) {
            return true;
        }


        $supplierModel = new SupplierChannelModel();
        $supplier = $supplierModel->where('supplier_id', $supplierId)->first()->toArray();
        $auditUserId = request()->user->userId;
        $logModel = new LogModel();
        //找出不能跳过审核检查并且是更新操作的日志,默认都是不能跳过
        $log = $logModel->where('supplier_id', $supplierId)
            ->where('type', LogModel::UPDATE_OPERATE)
            ->where('ignore_audit_check', 0)->orderBy('id', 'desc')->first();

        $log = $log ? $log->toArray() : [];
        //判断供应商,如果是第一次新增的供应商,要去判断创建人是否属于审核人相关的部门
        //别问我为啥不加多一个状态,这个审核流程是突然改成这样子的,没法加...
        if (empty($log)) {
            $lastUpdateUserId = $supplier['create_uid'];
        } else {
            $lastUpdateUserId = $log['admin_id'];
            if ($lastUpdateUserId == 1000) {
                return true;
            }
        }

        //专门给采购助理这个账号要做特殊逻辑,采购系统那边没有按照正常流程去判断,导致这个账号的部门分布完全不合理,所以供应商系统这边只能恶心自己去加特殊跳过了
        if ($lastUpdateUserId == config('field.AssistantUserId')) {
            return true;
        }

        //审批人只能审批自己的部下修改的供应商
        $departmentService = new DepartmentService();
        $subordinateUserIds = $departmentService->getSubordinateUserIds($auditUserId);

        if (in_array($lastUpdateUserId, $subordinateUserIds) || in_array($supplier['create_uid'],
                $subordinateUserIds)) {
            return true;
        }
        return false;
    }

    //判断是否为待跟进供应商
    public function checkIsNeedToFollowUpSupplier($supplierId)
    {
        $model = new SupplierChannelModel();
        $supplier = $model->where('supplier_id', $supplierId)->first();
        //针对非禁止交易状态的供应商重新分配渠道员,且必填信息不完整
        if (!empty($supplier) && ($supplier['status'] != SupplierChannelModel::STATUS_DISABLE)) {
            //开始检查
            //如果全部必填字段都有了,就返回false(不需要跟进)
            if ($this->checkHasAllRequireField($supplier)) {
                return false;
            } else {
                return true;
            }
        }
        //或者单纯只是禁用状态的供应商重新分配渠道员,也是要处理待跟进状态
        if (!empty($supplier) && ($supplier['status'] == SupplierChannelModel::STATUS_DISABLE)) {
            //开始检查
            return true;
        }
        return false;
    }

    //检查必填字段,false缺少必填字段
    public function checkHasAllRequireField($supplier)
    {
        //先检查基础字段
        if (empty($supplier['supplier_name']) || empty($supplier['region']) || empty($supplier['legal_representative'])) {
            return false;
        }
        if (empty($supplier['stockup_type']) || empty($supplier['supplier_group']) || empty($supplier['qualification_photos'])) {
            return false;
        }
        //再检查营业执照是否有
        if (isset($supplier['qualification_photos']['business_license']) && empty($supplier['qualification_photos']['business_license'])) {
            return false;
        }
        //检查是否有联系方式
        $contactModel = new SupplierContactModel();
        $count = $contactModel->where('supplier_id', $supplier['supplier_id'])->count();
        //没有联系方式,就需要去跟进
        if (!$count) {
            return false;
        }
        //联系方式和当前采购数量对不上,也要跟进
        $channelUserNumber = count(explode(',', $supplier['channel_uid']));
        if ($channelUserNumber != $count) {
            return false;
        }
        return true;
    }

    //判断是否要进入审核中状态,因为部分字段修改是不需要走审核的,这是更新之前的校验
    public function checkNeedAudit($supplierId, $channel)
    {
        $notNeedAuditField = [
            'register_company_name',
            'supplier_name_en',
            'province_id',
            'city_id',
            'established_time',
            'credit_investigation',
            'system_tags',
            'customer_tags',
            'sku_tag',
            'sku_tag',
            'sku_tag',
            'sku_upload_ruler',
            'sku_audit_ruler',
            'stockup_type'
        ];
        //先找出目前数据库里面的数据
        $selectField = array_keys($channel);
        $model = new SupplierChannelModel;
        $status = $model->where('supplier_id', $supplierId)->value('status');
        //只要是未通过的,都要进入审核
        if ($status == SupplierChannelModel::STATUS_REJECT) {
            return true;
        }

        $supplier = $model->select($selectField)->where('supplier_id', $supplierId)->first()->toArray();

        //如果有忽略审核的权限并且不需要复审,那么状态就是不需要审核直接通过
        $canIgnoreAudit = $this->checkCanIgnoreSupplierAudit($supplierId);
        if ($canIgnoreAudit) {
            return false;
        }
        $changeField = [];
        foreach ($supplier as $key => $value) {
            if ($value != $channel[$key]) {
                $changeField[] = $key;
            }
        }
        foreach ($changeField as $field) {
            //只要有一个不存在于不需要审核的字段,就返回需要审核
            if (!in_array($field, $notNeedAuditField)) {
                return true;
            } else {
                if ($field === 'stockup_type') {
                    //还要单独判断供应商的stockup_type,只有是操作芯链这个值的时候,才不去审核,真是服了
                    $oldStockupType = explode(',', trim($supplier['stockup_type'], ''));
                    $newStockupType = explode(',', trim($channel['stockup_type'], ''));
                    if (count($oldStockupType) > count($newStockupType)) {
                        $modifyStockupType = array_diff($oldStockupType, $newStockupType);
                    } else {
                        $modifyStockupType = array_diff($newStockupType, $oldStockupType);
                    }
                    if (array_values($modifyStockupType) != ['5']) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    //判断是否可以直接忽略修改审核
    public function checkCanIgnoreSupplierAudit($supplierId)
    {
        $needReview = SupplierChannelModel::where('supplier_id', $supplierId)->value('need_review');
        //如果有忽略审核的权限并且不需要复审,那么状态就是不需要审核直接通过
        if (checkPerm('IgnoreUpdateAudit') && !$needReview) {
            return true;
        } else {
            return false;
        }

    }
}