<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Services\LogService;
use App\Http\Transformers\LogTransformer;
use App\Http\Transformers\ReceiptTransformer;
use App\Http\Validators\ReceiptValidator;
use App\Model\LogModel;
use App\Model\SupplierChannelModel;
use App\Model\SupplierReceiptModel;
use Illuminate\Http\Request;

//通用API,比如获取品牌列表,分类列表等
class SupplierReceiptApiController extends Controller
{
    public function Entrance(Request $request, $id)
    {
        $this->$id($request, $id);
    }

    //获取供应商收款信息
    public function GetSupplierReceiptList($request)
    {
        $supplierId = $request->get('supplier_id');
        $limit = $request->get('limit', 10);
        $model = new SupplierReceiptModel();
        $model->where('supplier_id', $supplierId)->paginate();
        $list = $model->where('supplier_id', $supplierId)->orderBy('receipt_id', 'desc')
            ->paginate($limit)->toArray();
        $transformer = new ReceiptTransformer();
        $list['data'] = $transformer->transformList($list['data']);
        $this->response(0, 'ok', $list['data'], $list['total']);
    }

    //获取供应商信息变更记录
    public function AddSupplierReceipt($request)
    {
        //先去表单验证
        $validator = new ReceiptValidator();
        $requestData = $request->all();
        $validateResult = $validator->checkSave($requestData);
        if ($validateResult) {
            $this->response(-1, $validateResult);
        }
        $receipt = $request->only([
            'receipt_id',
            'supplier_id',
            'receipt_type',
            'bank_name',
            'bank_adderss',
            'account_no',
            'account_adderss',
            'swift_code',
            'certificate',
            'account_name',
            'remark',
        ]);
        $receipt['account_adderss'] = empty($receipt['account_adderss']) ? ' ' : $receipt['account_adderss'];
        if ($receipt['receipt_type'] == 1) {
            $receipt['swift_code'] = '';
        }
        $receiptId = $request->get('receipt_id');
        $supplierId = $request->get('supplier_id');
        $model = new SupplierReceiptModel();
        if (!empty($receiptId)) {
            $oldReceipt = $model->where('receipt_id', $receiptId)->first()->toArray();
            $result = $model->where('receipt_id', $receiptId)->update($receipt);
        } else {
            $oldReceipt = [];
            $receipt['supplier_id'] = $supplierId;
            $result = $model->insertGetId($receipt);
            $receiptId = $result;
        }
        if ($result) {
            $newReceipt = $model->where('receipt_id', $receiptId)->first()->toArray();
            //如果修改的只是备注,则不需要转成审核
            $needAudit = $this->checkNeedAudit($oldReceipt, $newReceipt);
            if ($needAudit || empty($request->get('receipt_id'))) {
                $supplierModel = new SupplierChannelModel();
                //修改供应商为审核状态
                $supplierModel->where('supplier_id', $supplierId)->update([
                    'update_time' => time(),
                    'status' => SupplierChannelModel::STATUS_PENDING,
                ]);
            }

            $logService = new LogService();
            $content = !empty($receipt['receipt_id']) ? '修改银行信息' : '添加银行信息';
            $remark = json_encode($receipt);
            $logService->AddLog($receipt['supplier_id'], LogModel::UPDATE_OPERATE, '修改供应商基本资料', $content, $remark);
            $this->response(0, '操作成功');
        }
        $this->response(-1, '操作失败');
    }

    //判断是否要进入审核中状态,因为部分字段修改是不需要走审核的
    private function checkNeedAudit($oldReceipt, $newReceipt)
    {
        $notNeedAuditField = [
            'remark',
        ];
        $diff = array_diff($oldReceipt, $newReceipt);
        unset($diff['update_time']);
        $changeField = array_keys($diff);
        foreach ($changeField as $filed) {
            //只要有一个不存在于不需要审核的字段,就返回需要审核
            if (!in_array($filed, $notNeedAuditField)) {
                return true;
            }
        }
        return false;
    }

    //删除
    public function DeleteSupplierReceipt($request)
    {
        $receiptId = $request->get('receipt_id');
        $model = new SupplierReceiptModel();
        $result = $model->where('receipt_id', $receiptId)->delete();
        if ($result) {
            $this->response(0, '操作成功');
        }
        $this->response(-1, '操作失败');
    }
}