package com.kingdee.eas.hr.org.app;

import com.alibaba.fastjson.JSONObject;
import com.kingdee.bos.BOSException;
import com.kingdee.bos.Context;
import com.kingdee.eas.common.EASBizException;
import com.kingdee.eas.custom.beisen.synchronousorg.synchronousOrg;
import com.kingdee.eas.custom.beisen.synchronousorg.synchronousOrgControllerBean;
import com.kingdee.eas.custom.beisen.synchronousorg.synchronousOrgFactory;
import com.kingdee.eas.custom.beisen.utils.BeiSenUtils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.util.Properties;

/**
 * 该类继承自 OrgUnitOptFacadeControllerBean，用于封装同步组织单元操作到外部接口的逻辑，
 * 并在删除、封存和解封组织单元时执行同步操作。
 */
public class OrgUnitOptFacadeControllerBeanEx extends OrgUnitOptFacadeControllerBean {

    /**
     * 封装同步组织单元操作到外部接口的逻辑。
     *
     * @param urlKey 配置文件中的 URL 键，用于从配置文件中获取对应的 URL
     * @param id     组织单元 ID，将作为参数拼接到 URL 中
     * @return 外部接口返回的 JSONObject 对象
     */
    private JSONObject syncOrgOperation(Context context,String urlKey, String id) {
        try {
            synchronousOrgFactory.getLocalInstance(context).createOrUpdateOrg(10, id, false);
        } catch (BOSException e) {
            System.out.println("同步组织失败"+e.getMessage());
        }
        // 创建 BeiSenUtils 工具类的实例，用于处理与外部接口交互的相关操作
        BeiSenUtils beiSenUtils = new BeiSenUtils(context);
        // 从工具类中获取配置文件的 Properties 对象
        Properties propt = beiSenUtils.propt;
        // 根据 URL 键从配置文件中获取对应的 URL
        String url = propt.getProperty(urlKey);
        try {
            // 将组织单元 ID 进行 UTF-8 编码，并拼接到 URL 后面作为参数
            url = url + "?originalId=" + URLEncoder.encode(id, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // 如果编码过程中出现不支持的编码异常，将其包装成运行时异常抛出
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        // 初始化用于存储接口响应的 JSONObject 对象
        JSONObject jsonObject = null;
        try {
            // 调用工具类的方法，向指定 URL 发送 PUT 请求，并获取接口响应的 JSONObject
            jsonObject = beiSenUtils.setDisableAndEnable(id,url, "PUT");
        } catch (IOException e) {
            // 如果请求过程中出现 IO 异常或 URI 语法异常，将其包装成运行时异常抛出
            System.out.println(e.getMessage());
            e.printStackTrace();
        } catch (URISyntaxException e) {
            // 如果请求过程中出现 IO 异常或 URI 语法异常，将其包装成运行时异常抛出
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        // 检查接口响应的状态码是否为 200，如果不是则抛出运行时异常，表示同步操作失败
        if (!"200".equals(jsonObject.getString("code"))) {
            System.out.println("同步操作失败，响应信息：" + jsonObject.toString());
        }
        return jsonObject;
    }

    /**
     * 在删除组织单元之前执行同步操作。
     *
     * @param ctx       上下文对象，包含系统运行时的相关信息
     * @param adminOrgID 组织单元 ID，用于指定要删除的组织单元
     * @throws BOSException     BOS 异常，可能在调用父类方法时抛出
     * @throws EASBizException  EAS 业务异常，可能在调用父类方法时抛出
     */
    @Override
    protected void beforDelete(Context ctx, String adminOrgID) throws BOSException, EASBizException {
        // 打印日志，标记当前执行的方法
        System.out.println("================com.kingdee.eas.hr.org.app.OrgUnitOptFacadeControllerBeanEx.beforDelete================");
        // 调用同步操作方法，将组织单元标记为禁用
        syncOrgOperation(ctx,"DEPARTMENTS_DISABLE", adminOrgID);
        // 调用父类的删除前处理方法
        super.beforDelete(ctx, adminOrgID);
    }

    /**
     * 封存组织单元时执行同步操作。
     *
     * @param ctx      上下文对象，包含系统运行时的相关信息
     * @param unitID   组织单元 ID，用于指定要封存的组织单元
     * @throws BOSException     BOS 异常，可能在调用父类方法时抛出
     * @throws EASBizException  EAS 业务异常，可能在调用父类方法时抛出
     */
    @Override
    protected void _sealUpOrg(Context ctx, String unitID) throws BOSException, EASBizException {
        // 打印日志，标记当前执行的方法
        System.out.println("===============com.kingdee.eas.hr.org.app.OrgUnitOptFacadeControllerBeanEx._sealUpOrg============");
        // 调用同步操作方法，将组织单元标记为禁用
        syncOrgOperation(ctx,"DEPARTMENTS_DISABLE", unitID);
        // 调用父类的封存组织单元方法
        super._sealUpOrg(ctx, unitID);
    }

    /**
     * 解封组织单元时执行同步操作。
     *
     * @param ctx      上下文对象，包含系统运行时的相关信息
     * @param unitId   组织单元 ID，用于指定要解封的组织单元
     * @throws BOSException     BOS 异常，可能在调用父类方法时抛出
     * @throws EASBizException  EAS 业务异常，可能在调用父类方法时抛出
     */
    @Override
    protected void _unSealUpOrg(Context ctx, String unitId) throws BOSException, EASBizException {
        // 先调用父类的解封组织单元方法
        super._unSealUpOrg(ctx, unitId);
        // 打印日志，标记当前执行的方法
        System.out.println("===========com.kingdee.eas.hr.org.app.OrgUnitOptFacadeControllerBeanEx._unSealUpOrg=================");
        // 调用同步操作方法，将组织单元标记为启用
        syncOrgOperation(ctx,"DEPARTMENTS_ENABLE", unitId);
    }
}