using Lada.Framework.Data.Domains.BaseEntities;
using Lada.Framework.Data.Domains.Identity;
using Lada.Framework.Data.Enums;
using System.ComponentModel.DataAnnotations;

namespace Lada.Framework.Data.Domains.Crm
{
    /// <summary>
    /// Call Log Entity - Lưu trữ thông tin cuộc gọi từ hệ thống tổng đài 3CX
    /// </summary>
    public class CallLog : BaseEntityWithKey<int>
    {
        /// <summary>
        /// Call number - mỗi cuộc gọi có một số, nội bộ của 3CX. Hữu ích cho việc theo dõi cuộc gọi.
        /// </summary>
        [MaxLength(50)]
        public string? HistoryID { get; set; }

        /// <summary>
        /// Call ID - định danh duy nhất của cuộc gọi.
        /// </summary>
        [MaxLength(50)]
        public string? CallID { get; set; }

        /// <summary>
        /// Thời gian cuộc gọi.
        /// </summary>
        [MaxLength(50)]
        public string? Duration { get; set; }

        /// <summary>
        /// Thời gian bắt đầu cuộc gọi.
        /// </summary>
        public DateTime? TimeStart { get; set; }

        /// <summary>
        /// Thời gian trả lời.
        /// </summary>
        public DateTime? TimeAnswered { get; set; }

        /// <summary>
        /// Thời gian kết thúc cuộc gọi.
        /// </summary>
        public DateTime? TimeEnd { get; set; }

        /// <summary>
        /// Lý do cuộc gọi bị chấm dứt.
        /// </summary>
        [MaxLength(100)]
        public string? ReasonTerminated { get; set; }

        /// <summary>
        /// Số điện thoại nguồn.
        /// </summary>
        [MaxLength(50)]
        public string? FromNo { get; set; }

        /// <summary>
        /// Số điện thoại đích.
        /// </summary>
        [MaxLength(50)]
        public string? ToNo { get; set; }

        /// <summary>
        /// Distinguished name của người gọi - đặc trữ của 3CX.
        /// </summary>
        [MaxLength(50)]
        public string? FromDN { get; set; }

        /// <summary>
        /// Distinguished name của đích - đặc trữ của 3CX.
        /// </summary>
        [MaxLength(50)]
        public string? ToDN { get; set; }

        /// <summary>
        /// Số được quay.
        /// </summary>
        [MaxLength(50)]
        public string? DialNo { get; set; }

        /// <summary>
        /// Lý do thay đổi trong cuộc gọi - ví dụ trong chuyển tiếp sẽ thấy "ReplacedDst".
        /// </summary>
        [MaxLength(100)]
        public string? ReasonChanged { get; set; }

        /// <summary>
        /// Số cuối cùng - số cuối cùng được thay thế (Trong chuyển tiếp đây sẽ là số được kết nối cuối cùng).
        /// </summary>
        [MaxLength(50)]
        public string? FinalNumber { get; set; }

        /// <summary>
        /// Distinguished name của số cuối cùng - đặc trữ của 3CX.
        /// </summary>
        [MaxLength(50)]
        public string? FinalDN { get; set; }

        /// <summary>
        /// Mã thanh toán được quay sau đích (ví dụ: **Sales).
        /// </summary>
        [MaxLength(50)]
        public string? BillCode { get; set; }

        /// <summary>
        /// Tỷ lệ thanh toán khớp với tiền tố của tỷ lệ.
        /// </summary>
        public decimal? BillRate { get; set; }

        /// <summary>
        /// Chi phí của cuộc gọi được tính bằng tỷ lệ đơn giản / phút.
        /// </summary>
        public decimal? BillCost { get; set; }

        /// <summary>
        /// Tên tỷ lệ của biến thể thanh toán.
        /// </summary>
        [MaxLength(100)]
        public string? BillName { get; set; }

        /// <summary>
        /// Tất cả các điểm cuối tham gia vào cuộc gọi.
        /// </summary>
        [MaxLength(100)]
        public string? Chain { get; set; }

        /// <summary>
        /// Loại nguồn.
        /// </summary>
        [MaxLength(50)]
        public string? FromType { get; set; }

        /// <summary>
        /// Loại đích.
        /// </summary>
        [MaxLength(50)]
        public string? ToType { get; set; }

        /// <summary>
        /// Loại đích cuối cùng.
        /// </summary>
        [MaxLength(50)]
        public string? FinalType { get; set; }

        /// <summary>
        /// Tên hiển thị nguồn.
        /// </summary>
        [MaxLength(100)]
        public string? FromDispName { get; set; }

        /// <summary>
        /// Tên hiển thị đích.
        /// </summary>
        [MaxLength(100)]
        public string? ToDispName { get; set; }

        /// <summary>
        /// Tên hiển thị đích cuối cùng.
        /// </summary>
        [MaxLength(100)]
        public string? FinalDispName { get; set; }

        /// <summary>
        /// Danh sách các agent hàng đợi được thăm dò trong cuộc gọi hàng đợi mà không trả lời cuộc gọi.
        /// </summary>
        [MaxLength(50)]
        public string? MissedQueueCalls { get; set; }

        /// <summary>
        /// Loại cuộc gọi.
        /// </summary>
        [MaxLength(50)]
        public string? CallType { get; set; }

        /// <summary>
        /// Trạng thái Lead
        /// </summary>
        public LeadStatus LeadStatus { get; set; } = LeadStatus.New;

        /// <summary>
        /// Nội dung trạng thái
        /// </summary>
        public string? StatusContent { get; set; }

        /// <summary>
        /// ID của user được mapping từ FinalDN
        /// </summary>
        public int? UserId { get; set; }

        /// <summary>
        /// Tên user được mapping từ FinalDN
        /// </summary>
        [MaxLength(100)]
        public string? UserName { get; set; }

        // Navigation properties
        /// <summary>
        /// User được mapping từ FinalDN
        /// </summary>
        public virtual User? User { get; set; }
    }
}
