package com.fs.aiSipCall.domain;

import com.fs.aiSipCall.utils.StringUtils;
import com.fs.common.annotation.Excel;
import lombok.Data;

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

/**
 * aiSIP外呼通话记录对象 ai_sip_call_phone
 * AI外呼扫描cc_call_phone这个表，
 * 人工外呼cc_outbound_cdr这个表，
 * 呼入是cc_inbound_cdr这个表
 *
 * @author fs
 * @date 2026-03-06
 */
@Data
public class AiSipCallPhone implements Serializable {

    /** $column.columnComment */
    private String id;

    /** 本地任务批次id */
    @Excel(name = "本地任务批次id")
    private Long localBatchId;
    /** 远程任务批次id */
    @Excel(name = "远程任务批次id")
    private Long batchId;
    /** 批次名称 */
    @Excel(name = "批次名称", readConverterExp = "批次名称")
    private String batchName;

    /** $column.columnComment */
    @Excel(name = "任务批次id")
    private String telephone;

    /** 客户称呼 */
    @Excel(name = "客户称呼")
    private String custName;

    /** 0. 未拨打
        1. 已进入呼叫队列
        2. 正在拨号
        3. 未接通（如果关闭空号检测）
        4. 已接通
        5. 通话中断（转人工前挂断）
        6. 成功转人工或AI
        7. 线路故障
        30. 未接通
        31. 客户正在通话中
        32. 关机
        33. 空号
        34. 无人接听
        35. 停机
        36. 网络忙
        37. 语音助手
        38. 暂时无法接通
        39. 呼叫限制
     */
    @Excel(name = "呼叫状态", readConverterExp = "如果关闭空号检测")
    private Long callstatus;

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

    /** 呼叫次数 */
    @Excel(name = "呼叫次数")
    private Long 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 = "人工坐席工号")
    private String acdOpnum;

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

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

    /** 语音通话通知的TTS文本 */
    @Excel(name = "语音通话通知的TTS文本")
    private String ttsText;

    /** $column.columnComment */
    @Excel(name = "语音通话通知的TTS文本")
    private String emptyNumberDetectionText;

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

    /** asr时长（秒） */
    @Excel(name = "asr时长", readConverterExp = "秒=")
    private Long asrSeconds;

    /** tts调用次数（次） */
    @Excel(name = "tts调用次数", readConverterExp = "次=")
    private Long ttsTimes;

    /** 大模型tts的字符数（字符） */
    @Excel(name = "大模型tts的字符数", readConverterExp = "字=符")
    private Long ttsFlowTokens;

    /** 总输入token数 */
    @Excel(name = "总输入token数")
    private Long inputTokens;

    /** 总输出token数 */
    @Excel(name = "总输出token数")
    private Long outputTokens;

    /** 总调用费用（asr+tts+大模型） */
    @Excel(name = "总调用费用", readConverterExp = "a=sr+tts+大模型")
    private BigDecimal totalCost;

    /** 计费状态（1：已计费、0：未计费） */
    @Excel(name = "计费状态", readConverterExp = "1=：已计费、0：未计费")
    private Long billingStatus;

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

    /** 客户输入的DTMF按键 */
    @Excel(name = "客户输入的DTMF按键")
    private String ivrDtmfDigits;

    /** 人工坐席应答时间 */
    @Excel(name = "人工坐席应答时间")
    private Long manualAnsweredTime;

    /** 人工坐席服务时长 */
    @Excel(name = "人工坐席服务时长")
    private Long manualAnsweredTimeLen;

    /** 外呼类型（0模板导入 1sop任务） */
    @Excel(name = "外呼类型（0模板导入 1sop任务）")
    private String callType;
    /** 销售公司ID */
    @Excel(name = "销售公司ID")
    private Long companyId;
    /** 销售ID */
    @Excel(name = "销售ID")
    private Long companyUserId;
    /** 销售账号 */
    @Excel(name = "销售账号")
    private String companyUserName;
    /** 总后台用户ID */
    @Excel(name = "总后台用户ID")
    private Long sysUserId;
    /** 总后台用户账号 */
    @Excel(name = "总后台用户账号")
    private String sysUserName;
    /** 外呼平台创建时间 */
    @Excel(name = "外呼平台创建时间")
    private Long createtime;
    /** 状态（0正常1删除） */
    @Excel(name = "状态（0正常1删除）")
    private Integer status;

    /** 录音文件url访问地址 */
    private String wavFileUrl;

    private String companyName;

    /** 通话总时长起止 */
    private Long timeLenStart;
    private Long timeLenEnd;
    /** 外呼时间起止 */
    private String calloutTimeStart;
    private String calloutTimeEnd;
    private Long calloutTimeStartLong;
    private Long calloutTimeEndLong;
    /** 接听时间起止 */
    private String answeredTimeStart;
    private String answeredTimeEnd;
    private Long answeredTimeStartLong;
    private Long answeredTimeEndLong;
    /** 挂机时间起止 */
    private String callEndTimeStart;
    private String callEndTimeEnd;
    private Long callEndTimeStartLong;
    private Long callEndTimeEndLong;
    /** 创建时间起止 */
    private String createtimeStart;
    private String createtimeEnd;
    private Long createtimeStartLong;
    private Long createtimeEndLong;


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

    private Integer pageSize;

    private Integer pageNum;

    /**
     * 呼叫状态码与状态名称映射
     */
    private static final Map<Integer, String> CALL_STATUS_MAP = new HashMap<>();

    static {
        CALL_STATUS_MAP.put(1, "已进入呼叫队列");
        CALL_STATUS_MAP.put(2, "正在拨号");
        CALL_STATUS_MAP.put(3, "未接通");
        CALL_STATUS_MAP.put(4, "已接通");
        CALL_STATUS_MAP.put(5, "通话中断");
        CALL_STATUS_MAP.put(6, "成功转人工或 AI");
        CALL_STATUS_MAP.put(7, "线路故障");
        CALL_STATUS_MAP.put(30, "未接通");
        CALL_STATUS_MAP.put(31, "客户正在通话中");
        CALL_STATUS_MAP.put(32, "关机");
        CALL_STATUS_MAP.put(33, "空号");
        CALL_STATUS_MAP.put(34, "无人接听");
        CALL_STATUS_MAP.put(35, "停机");
        CALL_STATUS_MAP.put(36, "网络忙");
        CALL_STATUS_MAP.put(37, "语音助手");
        CALL_STATUS_MAP.put(38, "暂时无法接通");
        CALL_STATUS_MAP.put(39, "呼叫限制");
    }

    /**
     * 根据呼叫状态码获取状态名称
     * @param status 状态码
     * @param uuid 通话会话
     * @return 状态名称
     */
    public static String getCallStatusName(Long status, String uuid) {
        if (status == null) {
            return "未知";
        }
        // 特殊处理状态0
        if (status == 0) {
            return StringUtils.isNotBlank(uuid) ? "未接听" : "待呼叫";
        }
        return CALL_STATUS_MAP.getOrDefault(status.intValue(), "未知状态");
    }
}
