<?php

namespace app\admin\service\approval;

use Illuminate\Support\Str;
use Illuminate\Support\Collection;
use support\spark\model\system\AdminOrg;
use support\spark\model\system\AdminRole;
use support\spark\model\system\ApprovalFlow;
use support\spark\model\system\ApprovalFlowLine;
use app\admin\service\approval\ApprovalFlowEngine;
use support\spark\model\system\ApprovalFlowLineNode;


/**
 * 审批流构建类
 * 
 * 假设已经有了申请组织、审批流程和角色对象
 * $applicantOrg = AdminOrg::find(1);
 * $approvalFlow = ApprovalFlow::find(1);
 * $role1 = AdminRole::find(1);
 * $role2 = AdminRole::find(2);

 * 创建一个 ApprovalFlowBuilder 实例
 * $builder = new ApprovalFlowBuilder($applicantOrg, $approvalFlow);

 * 设置审批流程标题、摘要和内容路径
 * $builder->setTitle('采购申请审批流程');
 * $builder->setSummary('用于审批采购申请的流程');
 * $builder->setContentUrl('/approval/workflow/purchase');

 * 添加审批节点(已废弃)
 * $builder->addNode($role1); // 第一个审批节点
 * $builder->addNode($role2); // 第二个审批节点

 * 构建审批流线
 * $approvalFlowLine = $builder->build();
 */
class ApprovalFlowBuilder
{
    /**
     * @var ApprovalFlow 审批流程
     */
    private ApprovalFlow $approvalFlow;
    /**
     * @var AdminOrg 申请组织
     */
    private AdminOrg $applicationOrg;
    /**
     * @var string 审批流线标识符
     */
    private string $flowlineCode;
    /**
     * @var string 标题
     */
    private string $title = '';
    /**
     * @var string 摘要
     */
    private string $summary = '';
    /**
     * @var string 内容路径
     */
    private string $contentUrl = '';
    /**
     * @var array 审批节点
     */
    private array $nodes = [];

    public function __construct(AdminOrg $applicantOrg, ApprovalFlow $approvalFlow)
    {
        $this->applicationOrg = $applicantOrg;
        $this->approvalFlow = $approvalFlow;
        $this->flowlineCode = static::createFlowLineCode($approvalFlow->flow_code);
    }

    /**
     * 设置标题
     * @param string $title
     */
    public function setTitle(string $title)
    {
        $this->title = $title;
    }

    /**
     * 设置摘要
     * @param string $summary
     */
    public function setSummary(string $summary)
    {
        $this->summary = $summary;
    }

    /**
     * 设置内容路径
     * @param string $contentUrl
     */
    public function setContentUrl(string $contentUrl)
    {
        $this->contentUrl = $contentUrl;
    }

    /**
     * 生成审批流线标识符
     *
     * @param string $flowCode 审批流标识符
     * @return string
     */
    private function createFlowLineCode(string $flowCode): string
    {
        $dateTime = date('YmdHis', time());
        $randomLetters = Str::random(6);

        return "{$flowCode}_{$dateTime}{$randomLetters}";
    }

    public function addNodeNew($path,$project_org_id,$company_org_id){
        $user_ids = getOrgUser($path['roleid'],$path['category'],$project_org_id,$company_org_id);
        // 节点
        $node = [
            'flow_line_node_role_id' => $path['roleid'],
            'flow_line_node_user_ids' => implode(',',$user_ids)
        ];

        // 如果nodes数组为空,设置开始时间
        if (!$this->nodes) {
            $node['flow_line_node_start_time'] = now();
        }
        // 添加节点
        $this->nodes[] = $node;
    }

    /**
     * 添加一个审批节点
     *
     * @param AdminRole $roleId 角色ID
     */
    public function addNode(AdminRole $role)
    {
        // 节点
        $node = [
            'flow_line_node_role_id' => $role->id,
            'flow_line_node_user_ids' => implode(',', $role->users()->pluck('id')->toArray())
        ];

        // 如果nodes数组为空,设置开始时间
        if (!$this->nodes) {
            $node['flow_line_node_start_time'] = now();

        }
        // 添加节点
        $this->nodes[] = $node;
    }

    /**
     * 构建审批流线
     */
    public function build(): ApprovalFlowLine
    {
        /** @var ApprovalFlowLine $line */
        $line = $this->approvalFlow->lines()->create([
            'project_org_id' => $this->applicationOrg->id,
            'company_org_id' => $this->applicationOrg->pid,
            'flow_line_code' => $this->flowlineCode,
            'flow_line_title' => $this->title,
            'flow_line_summary' => $this->summary,
            'flow_line_content_url' => $this->contentUrl,
            'flow_line_creator_id' => admin_id(),
        ]);

        // // 如果没有手动添加节点 则自动生成
        // if (!$this->nodes) {
        //     // 从 flow_path 中提取 roleid 列作为需要查询的 id 数组
        //     $roleIds = array_column($this->approvalFlow->flow_path, 'roleid');
        //     /** @var Collection|AdminRole[] $roles */
        //     $roles = AdminRole::findMany($roleIds);
        //     foreach ($roles as $role) {
        //         $this->addNode($role);
        //     }
        // }
        $line->nodes()->createMany($this->nodes);
        if($this->approvalFlow->flow_dingtalk_status == 1)
        {
           $approvalFlowLineNode = new ApprovalFlowLineNode();
           $node = $approvalFlowLineNode->where('approval_flow_line_id',$line->id)->first();
           (new ApprovalFlowEngine($line))->notifyDingTalk($node);
        }
        return $line;
    }
}