package com.ruoyi.aicall.domain;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * 外呼号码对象 cc_call_phone
 * 
 * @author ruoyi
 * @date 2025-05-29
 */
@Data
@Accessors(chain = true)
public class CcCallPhone implements Serializable {
    private static final long serialVersionUID = 1L;

    /**  */
    private String id;

    /** 业务组 */
    @Excel(name = "业务组")
    private String groupId;

    /** 任务批次id */
    @Excel(name = "任务批次id")
    private Long batchId;

    /**  */
    @Excel(name = "")
    private String telephone;

    /**  */
    @Excel(name = "客户姓名")
    private String custName;

    /** 创建时间 */
    @Excel(name = "创建时间")
    private Long createtime;

    /** 0  未拨打; 1   已经进入呼叫队列;  2   正在呼叫（进行中）;  3   未接通（状态： 客户正在通话中;   关机 ；  空号;  无人接听;   停机， ）;  4   已接通（拆分成接通后我方挂断，接通后对方挂断）; 5   呼损（未触发、未弹屏、仅弹屏、己介入）; 6   成功转接座席或者AI（只针对人机耦合）;  7线路故障;   [ 3、4、5  是统计大类， 实际写入到数据表的值是 后面的大数字 ]     31;  客户正在通话中;  32 关机;  33 空号;  34 无人接听; 35 停机。 41 拆分成接通后我方挂断;  42 接通后对方挂断 。 51 未触发（未到达弹屏节点）; 52 未弹屏（到达弹屏节点，没有弹屏出来） ;   53 仅弹屏（仅弹屏给座席但座席未介入通话，包括呼损）;   54 己介入（弹屏给到座席座席介入通话） */
    @Excel(name = "0  未拨打; 1   已经进入呼叫队列;  2   正在呼叫", readConverterExp = "进=行中")
    private Integer callstatus;

    /** 外呼时间 */
    @Excel(name = "外呼时间")
    private Long calloutTime;

    /** 呼叫次数 */
    @Excel(name = "呼叫次数")
    private Integer callcount;

    /** 呼叫结束时间 */
    @Excel(name = "呼叫结束时间")
    private Long callEndTime;

    /** 通话时长; 秒; */
    @Excel(name = "通话时长; 秒;")
    private Long timeLen;

    /** 有效通话时长; 秒 */
    @Excel(name = "有效通话时长; 秒")
    private Long validTimeLen;

    /** 通话唯一标志 */
    @Excel(name = "通话唯一标志")
    private String uuid;

    /** 通话接通时间 */
    @Excel(name = "通话接通时间")
    private Long connectedTime;

    /** 挂机原因 */
    @Excel(name = "挂机原因")
    private String hangupCause;

    /** 电话应答时间 */
    @Excel(name = "电话应答时间")
    private Long answeredTime;

    /** 对话内容 */
    @Excel(name = "对话内容")
    private String dialogue;

    /** 全程通话录音文件名 */
    @Excel(name = "全程通话录音文件名")
    private String wavfile;

    /** 录音文件路径前缀 */
    @Excel(name = "录音文件路径前缀")
    private String recordServerUrl;

    /** 业务json数据 */
    @Excel(name = "业务json数据")
    private String bizJson;

    /** 交互轮次（一问一答算一轮交互） */
    @Excel(name = "交互轮次", readConverterExp = "一=问一答算一轮交互")
    private Long dialogueCount;


    /** 人工坐席工号 */
    @Excel(name = "人工坐席工号", readConverterExp = "人工坐席工号")
    private String acdOpnum;

    /** 加入转人工排队的时间;  */
    @Excel(name = "加入转人工排队的时间; ", readConverterExp = "加入转人工排队的时间; ")
    private Long acdQueueTime;

    /** 人工排队等待时长,秒 */
    @Excel(name = "人工排队等待时长,秒", readConverterExp = "人工排队等待时长,秒")
    private Integer acdWaitTime;

    /** tts text for voice call notification. */
    @Excel(name = "tts text for voice call notification.", readConverterExp = "tts text for voice call notification.")
    private String ttsText;

    /** 客户意向 */
    @Excel(name = "客户意向", readConverterExp = "客户意向")
    private String intent;


    /** asr时长（秒） */
    private Integer asrSeconds;

    /** tts调用次数（次） */
    private Integer ttsTimes;

    /** 大模型tts的字符数（字符） */
    private Integer ttsFlowTokens;

    /** 总输入token数 */
    private Integer inputTokens;

    /** 总输出token数 */
    private Integer outputTokens;

    /** 总调用费用（asr+tts+大模型） */
    private BigDecimal totalCost;

    /** 计费状态（1：已计费、0：未计费） */
    private Integer billingStatus;

    /** 主叫号码 */
    @Excel(name = "主叫号码")
    private String callerNumber;

    /** 整个ivr通话中的有效按键 */
    private String ivrDtmfDigits;

    /** 请求参数 */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private Map<String, Object> params = new HashMap<>();

    /** 批次名称 */
    @Excel(name = "批次名称", readConverterExp = "批次名称")
    private String batchName;

    /** manual agent answered time. */
    private String manualAnsweredTime;

    /** The duration of the manual agent service time. */
    private String manualAnsweredTimeLen;

    private String callstatusName;
    private String calloutTimeStr;
    private String answeredTimeStr;
    private String callEndTimeStr;
    private String timeLenSec;

    /**
     * 根据呼叫状态码获取状态名称
     * @param status 状态码
     * @return 状态名称
     */
    public static String getCallStatusName(Integer status) {
        if (status == null) {
            return "未知";
        }
        switch (status) {
            case 0:
                return "未拨打";
            case 1:
                return "已进入呼叫队列";
            case 2:
                return "正在拨号";
            case 3:
            case 30:
                return "未接通";
            case 4:
                return "已接通";
            case 5:
                return "通话中断";
            case 6:
                return "成功转人工或 AI";
            case 7:
                return "线路故障";
            case 31:
                return "客户正在通话中";
            case 32:
                return "关机";
            case 33:
                return "空号";
            case 34:
                return "无人接听";
            case 35:
                return "停机";
            case 36:
                return "网络忙";
            case 37:
                return "语音助手";
            case 38:
                return "暂时无法接通";
            case 39:
                return "呼叫限制";
            default:
                return "未知状态";
        }
    }
}
