<?php

namespace app\admin\controller\emergency;

use app\admin\controller\Curd;
use app\admin\service\approval\ApprovalFlowBuilder;
use app\admin\service\common\ListDataUtil;
use app\admin\service\third\DingTalk;
use support\Request;
use support\spark\model\calibre\Messages;
use support\spark\model\emergency\TravelReport;
use support\spark\model\system\AdminOrg;
use support\spark\model\system\AdminRole;
use support\spark\model\system\AdminUser;
use support\spark\model\system\ApprovalFlow;
use support\spark\model\system\ApprovalFlowLine;
use support\spark\model\system\ApprovalFlowLineNode;
use support\View;

/**
 * 信行报送控制器
 */
class TravelReportController extends Curd
{

    /**
     * 获取用户
     * @return \support\Response
     */
    public function getUser()
    {
        $adminUserModel = new AdminUser();
        $where[] = ['status', '=', 1];
        $where[] = ['id', '>', 1];

        return sparkSuccess(dataReturn(0, 'ok', $adminUserModel->getAllList($where)));
    }

    public function processRole(Request $request)
    {
        $param = $request->all();
        // 如果存在 subResource 参数
        if ($param['subResource'] ?? false) {
            $subResource = [];
            $keyword = trim($param['keyword'] ?? '');
            // 根据 subResource 参数执行相应的操作
            switch ($param['subResource']) {
                case 'processRole':
                    $subResource = ApprovalFlow::where('flow_code', 'XINXINGBAOSONG')->first()->flow_path;
                    break;
                case 'approvalFlowLine':
                    $subResource = ApprovalFlowLine::with('nodes.approvalRole', 'nodes.approvalActualUser')->find($param['id']);
                    break;
                default:
                    return sparkSuccess(dataReturn(-1, '未知子资源'));
            }
            return sparkSuccess(dataReturn(0, '获取子资源成功', $subResource));
        }
    }

    public function sumbit(Request $request)
    {
        $param = $request->post();
        //获取管理员id
        $admin_id = admin_id();
        $id = $param['id'];
        //获取消息详情
        $travelItem = TravelReport::find($id)->toArray();
        //组织详情
        $current_org = AdminOrg::find($travelItem['org_id']);
        //状态设置为已读
        TravelReport::where('id', $id)->update(['is_read' => 1]);
        //判断是否有审批流程
        if ($travelItem['approval_id'] != null) {
            //撤销审批
            self::unSubmitApproval($id);
            return sparkSuccess(dataReturn(0, '撤销成功'));
        }

        //提交审批
        self::submitApproval($param, $current_org);
        //更新消息信息
        return sparkSuccess(dataReturn(0, '操作成功'));
    }
    public function unSubmitApproval($id)
    {
        $travel = TravelReport::find($id);
        /** @var ApprovalFlowLine $approvalFlowLine */
        $approvalFlowLine = $travel->approvalFlowLine;
        $approvalFlowLine->nodes()->delete();
        $approvalFlowLine->delete();
        $approvalFlowLineNode = new ApprovalFlowLineNode();
        $nodes = $approvalFlowLineNode->getAllList(['approval_flow_line_id' => $travel->approval_id]);
        //删除待办任务
        $res = '';
        foreach ($nodes as $item) {
            if ($item['talkId']) {
                $uids_ary = explode(',', $item['flow_line_node_user_ids']);
                foreach ($uids_ary as $v) {
                    $adminInfo = AdminUser::find($v);
                    if (!$adminInfo) {
                        continue;
                    }
                    if (!$adminInfo->unionId) {
                        continue;
                    }
                    $res = DingTalk::delTask($adminInfo->unionId, $item['talkId']);
                }
            }
        }
        $travel->update([
            'approval_id' => null,
            'update_time' => now()
        ]);
    }
    //推送审批
    public function submitApproval(array $postData, AdminOrg $model): void
    {

        $lineRoleIds = array_column($postData['processRoles'], 'roleid');
        $lineRoles = AdminRole::findMany($lineRoleIds);
        $applicantOrg = $model;
        $approvalFlow = ApprovalFlow::where('flow_code', 'XINXINGBAOSONG')->first();
        $builder = new ApprovalFlowBuilder($applicantOrg, $approvalFlow);
        $builder->setTitle("{$applicantOrg->name}信行报送审批");
        $builder->setSummary("信行报送审批");
        $builder->setContentUrl("https://anquansys.sxlq.com:37100/admin/calibre/list?messageId=" . $postData['id']);
        foreach ($lineRoles as $role) {
            $builder->addNode($role);
        }
        //         Db::beginTransaction();
        try {
            $line = $builder->build();
            (new TravelReport())->where('id', '=', $postData['id'])->update([
                'approval_id' => $line->id,
                'update_time' => now()
            ]);
            //获取第一个 发送钉钉消息
            $approvalFlowLineNode = new ApprovalFlowLineNode();
            $first_node = $approvalFlowLineNode->where('approval_flow_line_id', $line->id)->orderBy('id', 'asc')->limit(1)->get();
            $title = $applicantOrg->name . '信行报送';
            $open_url = "https://anquansys.sxlq.com:37100/admin/calibre/list?messageId=" . $postData['id'];

            if (count($first_node) && $first_node[0]['flow_line_node_user_ids']) {
                $uids_ary = explode(',', $first_node[0]['flow_line_node_user_ids']);
                $unionIds = [];
                $adminUser = new AdminUser();
                foreach ($uids_ary as $v) {
                    $adminInfo = AdminUser::find($v);
                    if (!$adminInfo) {
                        continue;
                    }
                    if ($adminInfo->unionId) {
                        $unionIds[] = $adminInfo->unionId;

                    } elseif (!$adminInfo->unionId && $adminInfo->mobile) {
                        $res = DingTalk::getUserInfo($adminInfo->mobile);
                        if (!$res) {
                            continue;
                        }
                        $unionIds[] = $res;
                        $adminUser->updateById(['unionId' => $res], $adminInfo->id);
                    }
                }
                if (count($unionIds) > 0) {
                    $talk_info = DingTalk::createTaskDo($unionIds, $title, $open_url, $first_node[0]['id']);
                    $approvalFlowLineNode->updateById(['talkId' => $talk_info['id']], $first_node[0]['id']);
                }
            }
            // DB::commit();
        } catch (\Exception $e) {
            // Db::rollBack(); // 回滚事务
            throw $e;
        }
    }

    public function callback(Request $request)
    {
        $param = $request->post();
        $status = $param['status'];
        $approval_flow_line_id = $param['approval_flow_line_id'];
        if ($status == 'COMPLETE') {
            (new TravelReport())->where('approval_id', $approval_flow_line_id)->update(['is_read' => 1]);
        }
        return sparkSuccess(dataReturn(0, '操作成功'));
    }
    public function index()
    {
        if (request()->isAjax()) {
            $param = request()->get();
            $where = [];
            // 通过session获取当前数据范围公司
            $orgInfo = getOrgSelfAndChildrenOrgsById();
            $org = end($orgInfo);
            if ($org['org_type'] === 'type_corporation') {
                $where[] = ['company_org_id', '=', $org['id']];
            } elseif ($org['org_type'] === 'type_company') {
                $where[] = ['project_org_id', '=', $org['id']];
            } else {
                $where[] = ['org_id', '=', $org['id']];
            }

            //报送人筛选
            if ($param['username']) {
                $user = AdminUser::where('name', 'like', '%' . $param['username'] . '%')->first()->toArray();
                $where[] = ['userid', '=', $user['id']];
            }

            //根据电话筛选
            if ($param['mobile']) {
                $user = AdminUser::where('mobile', 'like', '%' . $param['mobile'] . '%')->first()->toArray();
                $where[] = ['userid', '=', $user['id']];
            }

            $resourceOnDuty = new TravelReport();
            $list = $resourceOnDuty->with('user')->where($where)->orderBy('id', 'desc')->paginate($param['limit']);
            return sparkSuccess(dataReturn(0, 'success', $list));
        }
        $org_id = request()->get('org_id');
        return view('emergency/travelReport/index', ['org_id' => $org_id]);
    }

    public function add()
    {
        if (request()->isAjax()) {
            $param = request()->post();
            $orgInfo = getOrgFromLevel4($param['org_id']);
            dump(array_merge($param, $orgInfo));
            (new TravelReport())->insertOne(array_merge($param, $orgInfo));
            return sparkSuccess(dataReturn(0, '添加成功'));
        }

        View::assign([
            'orgList' => asTreeArray((new AdminOrg())
                ->getAllList([['status', '=', 1]], ['id', 'name', 'pid']), 'pid'),
        ]);
        return view('emergency/travelReport/add');
    }

    public function edit()
    {
        if (request()->isAjax()) {
            $param = request()->post();
            $res = (new TravelReport())->updateById($param, $param['id']);
            return sparkSuccess(dataReturn(0, '修改成功'));
        }

        $id = request()->get('id');
        $row = (new TravelReport())->getInfoById($id);
        View::assign([
            'orgList' => asTreeArray((new AdminOrg())
                ->getAllList([['status', '=', 1]], ['id', 'name', 'pid']), 'pid'),
            'info' => $row
        ]);
        return view('emergency/travelReport/edit');
    }

    public function del()
    {
        $id = request()->get('id');
        $resourceEquipment = new TravelReport();
        $resourceEquipment->delById($id);
        return sparkSuccess(dataReturn(0, '删除成功'));
    }
}