<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Services\AdminUserService;
use App\Http\Services\DepartmentService;
use App\Http\Services\LogService;
use App\Http\Services\SupplierContactService;
use App\Http\Transformers\SupplierContactTransformer;
use App\Http\Validators\SupplierContactValidator;
use App\Model\LogModel;
use App\Model\SupplierChannelModel;
use App\Model\SupplierContactModel;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

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

    //获取供应商联系人
    public function GetSupplierContactList($request)
    {
        $supplierId = $request->get('supplier_id');
        $limit = $request->get('limit', 10);
        $canViewAllSupplierContact = checkPerm('ViewAllSupplierContact');
        $canViewSubordinateSupplierContact = checkPerm('ViewSubordinateSupplierContact');
        $model = new SupplierContactModel();
        $query = $model->where('supplier_id', $supplierId)->orderBy('contact_id', 'desc');
        $adminId = $request->user->userId;
        $codeId = $request->user->codeId;
        //不能查看所有的,就是说只能看绑定的采购的
        if ($canViewAllSupplierContact) {

        } elseif ($canViewAllSupplierContact) {
            //查看下级
            $departmentService = new DepartmentService();
            //下属用户id(结果包括自己的id)
            $subordinateUserIds = $departmentService->getSubordinateUserIds($adminId);
            $adminUserService = new AdminUserService();
            $subordinateCodeIds = $adminUserService->getCodeIdsByUserIds($subordinateUserIds);
            $subordinateCodeIds = $subordinateCodeIds->toArray();
            //因为可以查看自己部下相关的采购员,开发员的供应商,所以要构建复杂likeIn语句需要的数据
            //注意下面三个条件最外层要用()包围起来,要不然mysql数据会有问题,具体自己查询mysql的and和or的语法注意事项
            $inCodeIdSql = implode(',', $subordinateCodeIds);
            $inUserIdSql = implode(',', $subordinateUserIds);
            $inCodeIdSql = "(" . $inCodeIdSql . ")";
            $inUserIdSql = "(" . $inUserIdSql . ")";
            if ($inCodeIdSql) {
                $query->whereRaw(DB::raw("(admin_id in $inUserIdSql or can_check_uids in $inCodeIdSql)"));
            } else {
                $query->whereRaw(DB::raw("(admin_id in $inUserIdSql)"));
            }
        } else {
            if ($codeId) {
                $query->whereRaw("(can_check_uids =  $codeId or admin_id = $adminId)");
            } else {
                $query->whereRaw("(admin_id = $adminId)");
            }
        }
        $list = $query->paginate($limit)->toArray();
        $transformer = new SupplierContactTransformer();
        $list['data'] = $transformer->transformList($list['data']);
        $this->response(0, 'ok', $list['data'], $list['total']);
    }

    public function SaveSupplierContact($request)
    {
        $data = $request->only([
            'contact_id',
            'supplier_id',
            'supplier_consignee',
            'supplier_telephone',
            'supplier_fax',
            'supplier_qq',
            'supplier_mobile',
            'supplier_email',
            'supplier_position',
            'can_check_uids'
        ]);
        $data = BatchTrim($data);
        //先去表单验证
        $validator = new SupplierContactValidator();
        $validateResult = $validator->checkSave($request);
        if ($validateResult) {
            $this->response(-1, $validateResult);
        }
        $service = new SupplierContactService();
        $hasNeedReplaceContact = $service->getNeedReplaceContact($data['supplier_id'], $data['can_check_uids']);
        $result = $service->saveContact($data);
        if (!$result) {
            $this->response(-1, '操作失败');
        }

        //有需要自动替换补全数据操作后的提示
        if ($hasNeedReplaceContact) {
            $this->response(0, '系统检测到当前采购有默认的空联系人,直接更新对应数据');
        }else{
            $this->response(0, '保存成功');
        }
    }

    public function DeleteSupplierContact($request)
    {
        $contactId = $request->get('contact_id');
        if ($contactId) {
            $model = new SupplierContactModel();
            $contact = $model->where('contact_id', $contactId)->first();
            $contactCount = $model->where('supplier_id', $contact['supplier_id'])->count();
            if ($contactCount == 1) {
                $this->response(-1, '供应商至少要有一个联系方式');
            }
            //从主表里面删除对应的采购
            //先去判断这个采购是不是唯一的
            $canCheckUids = $contact['can_check_uids'];
            $userNum = $model->where('supplier_id', $contact['supplier_id'])->where('can_check_uids',
                $canCheckUids)->count();
            if ($userNum === 1) {
                //如果只有一个,那就可以去主表删除对应的采购员了
                $supplierModel = new SupplierChannelModel();
                $supplier = $supplierModel->where('supplier_id', $contact['supplier_id'])->first();
                $channelUid = explode(',', $supplier['channel_uid']);
                if (in_array($canCheckUids, $channelUid)) {
                    //删除
                    $channelUid = array_filter($channelUid, function ($value) use ($canCheckUids) {
                        return $value != $canCheckUids;
                    });
                    $supplierModel->where('supplier_id', $contact['supplier_id'])->update([
                        'channel_uid' => implode(',', $channelUid),
                        'update_time' => time(),
                    ]);
                }
            }
            $result = $model->whereIn('contact_id', $contactId)->delete();
            if (!$result) {
                $this->response(-1, '删除失败');
            }

            $logService = new LogService();
            $content = '删除联系人';
            $remark = json_encode(['old_contact' => $contact, 'new_contact' => []]);
            $logService->AddLog($contact['supplier_id'], LogModel::UPDATE_OPERATE, '修改供应商基本资料', $content, $remark);
            $this->response(0, '删除成功');
        }
        $this->response(-1, '找不到删除对象');
    }
}