package com.goldenwater.slaj.acci.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson2.JSON;
import com.goldenwater.common.core.domain.AjaxResult;
import com.goldenwater.common.utils.http.HttpUtils;
import org.springframework.http.MediaType;
import java.util.*;

@Service
public class AcciNotifyService {

    private static final Logger log = LoggerFactory.getLogger(AcciNotifyService.class);

    @Value("${wsrest.notice.url:http://localhost:8080/WSRest/service/notice}")
    private String noticeUrl;

    @Value("${wsrest.backlog.url:http://localhost:8080/WSRest/service/backlog}")
    private String backlogUrl;

    @Value("${wsrest.sms.url:http://localhost:8080/WSRest/service/emay_send}")
    private String smsUrl;

    /**
     * 发送内部通知 — 向指定单位的收件箱推送消息（月报审核结果、事故催报提醒等）。
     * noticeCode 固定为 "11555113"（水文安全通知类型标识），appCode 区分业务模块。
     * 通知写入 WS 统一通知中心，收件人登录后可在站内信模块查看。
     *
     * @param orgGuid 目标单位 GUID（接收通知的单位）
     * @param title   通知标题（如 "2025年6月事故月报审核通过"）
     * @param content 通知正文
     */
    public AjaxResult sendNotice(String orgGuid, String title, String content) {
        return sendNotice(orgGuid, title, content, "acci");
    }

    /**
     * 发送内部通知（指定业务模块）
     * @param orgGuid 目标单位 GUID
     * @param title   通知标题
     * @param content 通知正文
     * @param appCode 业务模块标识（acci/hidd/hazard 等）
     */
    public AjaxResult sendNotice(String orgGuid, String title, String content, String appCode) {
        try {
            Map<String, Object> notice = new HashMap<>();
            notice.put("noticeCode", "11555113");
            notice.put("noticeTitle", title);
            notice.put("noticeContent", content);
            notice.put("orgGuid", orgGuid);
            notice.put("appCode", appCode);
            notice.put("fromDate", new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            String jsonStr = JSON.toJSONString(notice);
            String resp = HttpUtils.sendPost(noticeUrl, jsonStr, MediaType.APPLICATION_JSON_VALUE);
            log.info("通知发送响应: {}", resp);
            return AjaxResult.success("通知发送成功");
        } catch (Exception e) {
            log.error("通知发送失败", e);
            return AjaxResult.error("通知发送失败: " + e.getMessage());
        }
    }

    /**
     * 创建待办事项 — 在 WS 统一待办中心生成一条待办任务，生命周期为：创建→已读→关闭。
     * 创建时 isread 置为 "0"（未读），用户点击待办链接（busiUrl）处理后标记为已读并关闭。
     * 用于：月报到期催办、事故审核任务分派等需要用户确认处理的场景。
     *
     * @param orgGuid  所属单位 GUID
     * @param busiCode 业务编码，用于关联具体业务记录
     * @param busiName 待办标题（前端展示用）
     * @param busiUrl  待办处理页面的前端路由
     * @param userGuid 指定的处理人 GUID（为 null 时发送给单位所有成员）
     */
    public AjaxResult createBacklog(String orgGuid, String busiCode, String busiName, String busiUrl, String userGuid) {
        try {
            Map<String, Object> backlog = new HashMap<>();
            backlog.put("appCode", "acci");
            backlog.put("busiCode", busiCode);
            backlog.put("busiName", busiName);
            backlog.put("orgGuid", orgGuid);
            backlog.put("busiUrl", busiUrl);
            backlog.put("isread", "0");
            backlog.put("userGuid", userGuid);
            String jsonStr = JSON.toJSONString(backlog);
            String resp = HttpUtils.sendPost(backlogUrl, jsonStr, MediaType.APPLICATION_JSON_VALUE);
            log.info("待办创建响应: {}", resp);
            return AjaxResult.success("待办创建成功");
        } catch (Exception e) {
            log.error("待办创建失败", e);
            return AjaxResult.error("待办创建失败: " + e.getMessage());
        }
    }

    /**
     * 发送短信通知 — 向单位应急联系人的手机号发送事故预警或月报催报短信。
     * 手机号来自单位基本信息中登记的应急联系人字段，触发时机包括：
     * ①发生生产安全事故时自动通知单位安全负责人；
     * ②月报截止日期前 3 天自动发送催报提醒。
     * 短信通过 WS 的亿美短信通道下发，确保关键通知触达及时。
     *
     * @param phone   目标手机号（应急联系人号码）
     * @param content 短信正文（需控制在 70 汉字/条以内）
     */
    public AjaxResult sendSms(String phone, String content) {
        try {
            Map<String, Object> sms = new HashMap<>();
            List<String> mobiles = new ArrayList<>();
            mobiles.add(phone);
            sms.put("mobiles", mobiles);
            sms.put("context", content);
            String jsonStr = JSON.toJSONString(sms);
            String resp = HttpUtils.sendPost(smsUrl, jsonStr, MediaType.APPLICATION_JSON_VALUE);
            log.info("短信发送响应: {}", resp);
            return AjaxResult.success("短信发送成功");
        } catch (Exception e) {
            log.error("短信发送失败", e);
            return AjaxResult.error("短信发送失败: " + e.getMessage());
        }
    }
}
