<?php


namespace App\Http\Validators;

use App\Http\Services\SupplierPayTypeService;
use App\Model\SupplierAttachmentModel;
use App\Model\SupplierAttachmentsModel;
use App\Model\SupplierChannelModel;
use App\Model\SupplierContactModel;
use App\Model\SupplierReceiptModel;
use Validator;

class SupplierValidator
{
    //保存相关的验证,别问我为什么不用laravel自带的form-request类
    //因为控制器那边已经被之前的人魔改的难用的一比,而且控制器那边还接收了一大堆统一变量
    public function checkSave($validateData, $isAudit)
    {
        //整理下请求数据
        $validateData = $this->transformRequestData($validateData);
        //这个supplierId是用来判断是新增还是修改的
        $supplierId = array_get($validateData, 'supplier_id');
        //如果是修改直接提交,不是点申请审核的,只需要校验供应商名称是否存在即可
        if (!$isAudit) {
            if (empty($validateData['supplier_name'])) {
                return '供应商名称 不能为空';
            }

            if (empty($supplierId)) {
                $count = SupplierChannelModel::where('supplier_name', $validateData['supplier_name'])->count();
            } else {
                $count = SupplierChannelModel::where('supplier_name', $validateData['supplier_name'])
                    ->where('supplier_id', '!=', $supplierId)->count();
            }
            if ($count) {
                return "该供应商名称已经存在,请核验后再提交";
            }

            return null;
        }

        $rules = [
            'supplier_type' => 'required',
            'supplier_name' => 'required',
            'legal_representative' => 'required',
            'stockup_type' => 'required',
            'main_brands' => 'required',
            'pay_type' => 'required',
            'settlement_type' => 'required',
            'currency' => 'required',
            'main_customers' => 'max:100',
            'ticket_time' => 'max:20',
            'region' => 'required',
            'cn_delivery_time' => 'regex:/^\d+\-\d$/',
            'us_delivery_time' => 'regex:/^\d+\-\d$/',
            'shipping_address' => 'max:100',
            //'billing_period_detail' => 'required|max:100',
            'return_address' => 'max:100',
            'return_consignee' => 'max:50',
            'return_phone' => 'max:50',
            'cn_ratio' => 'min:1',
            'us_ratio' => 'min:1',
        ];
        $contactRuler = [
            'supplier_consignee' => 'required|max:50',
            'supplier_mobile' => 'required|max:30',
            'supplier_telephone' => 'required|max:30',
            'supplier_email' => 'required|email',
            'supplier_position' => 'required|max:30',
            'can_check_uids' => 'required',
        ];

        $errorMessageList = [];

        /**
         * --->>附件必填要求:
         * 如果供应商类别为正式供应商,营业执照、开票资料必须上传,供应商性质为现货商,则品质保证协议必须上传;
         * 如果供应商类别为临时供应商,营业执照、开票资料必须上传,品质保证协议不需要上传
         **/
        //只有在提交供应商是正式的时候,才会去校验附件
        //校验附件这块,新增和修改判断的逻辑不一样
        if (empty($supplierId)) {
            $attachmentFields = array_unique($validateData['field_name']);
        } else {
            $attachmentFields = SupplierAttachmentsModel::where('supplier_id',
                $supplierId)->get()->pluck('field_name')->toArray();
        }
        if (!$attachmentFields) {
            $errorMessageList[] = '请上传附件';
        }
        $attachmentFields = array_unique($attachmentFields);
        //fixed.php FileNameMapping 可以知道所有对应关系

        if (!in_array('business_license', $attachmentFields)) {
            $errorMessageList[] = '营业执照必须上传';
        }

        if (!in_array('billing_information', $attachmentFields)) {
            $errorMessageList[] = '开票资料必须上传';
        }

        if ($validateData['supplier_type'] == 1 && $validateData['supplier_group'] == 2) {
            if (!in_array('quality_assurance_agreement', $attachmentFields)) {
                $errorMessageList[] = '供应商为正式供应商,并且供应商类型是现货商,则品质保证协议必须上传';
            }
        }

        //银行信息校验
        $receiptValidator = new ReceiptValidator();
        if (empty($supplierId)) {
            $receiptData = array_only($validateData, [
                'receipt_type',
                'bank_name',
                'bank_adderss',
                'account_no',
                'account_name',
                'account_adderss',
                'certificate',
                'swift_code',
            ]);
            $receiptValidateResult = $receiptValidator->checkSave($receiptData, true);
            if ($receiptValidateResult) {
                $errorMessageList = array_merge($errorMessageList, $receiptValidateResult);
            }
        } else {
            $receipts = SupplierReceiptModel::where('supplier_id', $supplierId)->get()->toArray();
            if (!$receipts) {
                $errorMessageList[] = '供应商至少有一个财务信息,请补全';
            } else {
                foreach ($receipts as $receipt) {
                    $receiptValidateResult = $receiptValidator->checkSave($receipt);
                    if ($receiptValidateResult) {
                        $errorMessageList[] = $receiptValidateResult;
                    }
                }
            }

        }


        //联系人校验
        if (empty($supplierId)) {
            $rules = array_merge($rules, $contactRuler);
        } else {
            //修改的时候,还要去判断联系人是否有
            //至少要有一个联系方式
            $contactCount = SupplierContactModel::where('supplier_id', $supplierId)->count();
            if (!$contactCount) {
                $errorMessageList[] = "供应商至少要有一个联系人,请补全";
            }
        }

        //币种为人民币的话需要验证税号
        if ($validateData['currency'] == 1) {
            $rules['tax_number'] = 'required';
        }

        //如果付款方式为账期,那么月结天数一定要选
        if ($validateData['pay_type'] == 1) {
            if (!$validateData['pay_type_value']) {
                $errorMessageList[] = '付款方式选择账期,月结天数必须设置';
            }
        }

        //新增的时候,渠道开发 不能为空
        if (empty($supplierId)) {
            $rules['purchase_uid'] = 'required';
        }

        $messages = $this->messages();
        $validator = Validator::make($validateData, $rules, $messages);
        if ($validator->fails()) {
            $errors = $validator->errors()->all();
            $errorMessageList = array_merge($errors, $errorMessageList);
        }


        //检验名称是否已经存在数据库
        if (!empty($validateData['supplier_name'])) {
            $companyNameCount = 0;
            if (empty($supplierId)) {
                $count = SupplierChannelModel::where('supplier_name', $validateData['supplier_name'])->count();
                $companyNameCount = SupplierChannelModel::where('register_company_name',
                    $validateData['register_company_name'])->where('register_company_name', '!=', '')->count();
            } else {
                $count = SupplierChannelModel::where('supplier_name', $validateData['supplier_name'])
                    ->where('supplier_id', '!=', $supplierId)->count();
            }
            if ($count) {
                $errorMessageList[] = "该供应商名称已经存在,请核验后再提交";
            }
            if ($companyNameCount) {
                $errorMessageList[] = "该注册公司名已经存在,请核验后再提交";
            }
        }

        if (!empty($supplierId)) {
            //还要去判断当前提交人是否存在与其关联的联系人没有完善
            $codeId = request()->user->codeId;
            $notCompleteContacts = SupplierContactModel::where('supplier_id', $supplierId)
                ->where('can_check_uids', $codeId)
                ->where(function ($q) {
                    $q->where('supplier_consignee', '')
                        ->orWhere('supplier_position', '')
                        ->orWhere('supplier_email', '')
                        ->orWhere('supplier_mobile', '')
                        ->orWhere('supplier_telephone', '');
                })->get();
            $notCompleteContacts = !empty($notCompleteContacts) ? $notCompleteContacts->toArray() : [];
            if ($notCompleteContacts) {
                $errorMessageList[] = "存在和你相关的联系人没有完善,请先去完善相关联系人";
            }
        }

        return implode('|', $errorMessageList);
    }

    private
    function messages()
    {
        return [
            'supplier_type.required' => '供应商类别 不能为空',
            'supplier_name.required' => '供应商名称 不能为空',
            'currency.required' => '结算币种 不能为空',
            'legal_representative.required' => '法人代表 不能为空',
            'stockup_type.required' => '合作类型 不能为空',
            'pay_type.required' => '付款周期 不能为空',
            'settlement_type.required' => '结算方式 不能为空',
            'register_company_name.required' => '注册公司名 不能为空',
            'supplier_group.required' => '公司性质 不能为空',
            'supplier_address.required' => '注册地址 不能为空',
            'region.required' => '所在区域 不能为空',
            'purchase_uid.required' => '渠道开发员 不能为空',
            'cn_ratio.min' => '人民币系数必须是大于1的浮点数',
            'business_license.required' => '营业执照 不能为空',
            'established_time.required' => '成立时间 不能为空',
            'us_ratio.min' => '美金系数必须是大于1的浮点数',
            'us_delivery_time.regex' => '香港货期格式不正确',
            'cn_delivery_time.regex' => '大陆货期格式不正确',
            'tax_number.required' => '如果选择币种为人民币,则公司税号 不能为空',
            'supplier_consignee.required' => '联系方式的联系人 不能为空',
            'supplier_consignee.max' => '联系方式的联系人不能超过50个字符',
            'supplier_position.required' => '联系方式的职称 不能为空',
            'supplier_position.max' => '联系方式的职称不能超过30个字符',
            'supplier_telephone.required' => '联系方式的座机号 不能为空',
            'supplier_mobile.required' => '联系方式的手机号 不能为空',
            'supplier_mobile.max' => '联系方式的手机号不能超过30个字符',
            'supplier_email.required' => '联系方式的邮箱 不能为空',
            'supplier_email.email' => '联系方式的邮箱格式不对',
            'can_check_uids.required' => '联系方式对应的采购员 不能为空',
            'shipping_address.required' => '发货地址 不能为空',
            'shipping_address.max' => '发货地址不能超过100个字符',
            'return_address.max' => '退货地址不能超过100个字符',
            'return_consignee.max' => '退货收货人不能超过50个字符',
            'return_phone.max' => '退货收货人电话不能超过50个字符',
            'main_brands.required' => '主营品牌 不能为空',
            'main_customers.max' => '3-5家客户描述不能超过100个字符',
            'ticket_time.max' => '到票时间不能超过20个字符',
            'billing_period_detail.required' => '账期详情 不能为空',
            'billing_period_detail.max' => '账期详情不能超过100个字符',
        ];
    }

    public
    function transformRequestData(
        $validateData
    ) {
        foreach ($validateData as &$item) {
            if (!is_array($item)) {
                $item = trim($item);
            }
        }
        return $validateData;
    }
}