using Lada.Framework.Data.Domains.Hr;
using Lada.Framework.DTO;
using Lada.Framework.Infrastructures.Helpers;
using System.ComponentModel.DataAnnotations;

namespace Ladaer.BackEnd.Infrastructures.DTO.Models.Hr
{
    /// <summary>
    /// Model để tạo và cập nhật ứng viên
    /// </summary>
    public class CandidateModel : BaseModel<int>
    {
        /// <summary>
        /// Họ và tên
        /// </summary>
        [Required(ErrorMessage = "Vui lòng nhập họ và tên")]
        [StringLength(128, ErrorMessage = "Họ và tên không được vượt quá 128 ký tự")]
        [Display(Name = "Họ và tên")]
        public string FullName { get; set; } = "";

        /// <summary>
        /// Số điện thoại
        /// </summary>
        [Required(ErrorMessage = "Vui lòng nhập số điện thoại")]
        [StringLength(128, ErrorMessage = "Số điện thoại không được vượt quá 128 ký tự")]
        [Phone(ErrorMessage = "Số điện thoại không hợp lệ")]
        [Display(Name = "Số điện thoại")]
        public string PhoneNumber { get; set; } = "";

        /// <summary>
        /// Năm sinh
        /// </summary>
        [StringLength(64, ErrorMessage = "Năm sinh không được vượt quá 64 ký tự")]
        [Display(Name = "Năm sinh")]
        public string YearOfBirth { get; set; } = "";

        /// <summary>
        /// Địa chỉ hiện tại
        /// </summary>
        [Required(ErrorMessage = "Vui lòng nhập địa chỉ")]
        [StringLength(512, ErrorMessage = "Địa chỉ không được vượt quá 512 ký tự")]
        [Display(Name = "Địa chỉ")]
        public string Address { get; set; } = "";

        /// <summary>
        /// Giới thiệu về bản thân
        /// </summary>
        [StringLength(1024, ErrorMessage = "Giới thiệu không được vượt quá 1024 ký tự")]
        [Display(Name = "Giới thiệu về bản thân")]
        public string Introduction { get; set; } = "";

        /// <summary>
        /// Trạng thái hồ sơ
        /// </summary>
        [Display(Name = "Trạng thái")]
        public CandidateStatus Status { get; set; } = CandidateStatus.New;

        /// <summary>
        /// Tên trạng thái (chỉ đọc)
        /// </summary>
        public string StatusStr => Status.GetDescription();

        /// <summary>
        /// Nội dung đánh dấu trạng thái
        /// </summary>
        [StringLength(512, ErrorMessage = "Nội dung trạng thái không được vượt quá 512 ký tự")]
        [Display(Name = "Nội dung trạng thái")]
        public string StatusContent { get; set; } = "";

        /// <summary>
        /// Thời gian hẹn phỏng vấn
        /// </summary>
        [Display(Name = "Thời gian hẹn phỏng vấn")]
        public DateTimeOffset? AppointmentTime { get; set; }

        /// <summary>
        /// Ghi chú
        /// </summary>
        [StringLength(512, ErrorMessage = "Ghi chú không được vượt quá 512 ký tự")]
        [Display(Name = "Ghi chú")]
        public string Note { get; set; } = "";

        /// <summary>
        /// ID vị trí tuyển dụng
        /// </summary>
        [Display(Name = "Vị trí tuyển dụng")]
        public int? JobId { get; set; }

        /// <summary>
        /// Nguồn ứng viên
        /// </summary>
        [Display(Name = "Nguồn ứng viên")]
        public CandidateSource Source { get; set; } = CandidateSource.Website;

        /// <summary>
        /// Tên nguồn ứng viên (chỉ đọc)
        /// </summary>
        public string SourceStr => Source.GetDescription();

        #region CV Information
        /// <summary>
        /// File CV để upload (chỉ sử dụng khi tạo/cập nhật)
        /// </summary>
        [Display(Name = "File CV")]
        public IFormFile? CvFile { get; set; }

        /// <summary>
        /// Tên file CV gốc
        /// </summary>
        [StringLength(256, ErrorMessage = "Tên file CV không được vượt quá 256 ký tự")]
        [Display(Name = "Tên file CV")]
        public string CvFileName { get; set; } = "";

        /// <summary>
        /// Đường dẫn lưu trữ CV trong hệ thống (chỉ đọc)
        /// </summary>
        public string CvFilePath { get; set; } = "";

        /// <summary>
        /// Kích thước file CV (bytes) (chỉ đọc)
        /// </summary>
        [Display(Name = "Kích thước file")]
        public long CvFileSize { get; set; } = 0;

        /// <summary>
        /// Kích thước file CV hiển thị (chỉ đọc)
        /// </summary>
        public string CvFileSizeDisplay => CvFileSize > 0 ? FormatFileSize(CvFileSize) : "";

        /// <summary>
        /// Loại file CV (pdf, doc, docx, jpg, png, etc.) (chỉ đọc)
        /// </summary>
        [Display(Name = "Loại file")]
        public string CvFileType { get; set; } = "";

        /// <summary>
        /// URL để truy cập CV (chỉ đọc)
        /// </summary>
        public string CvFileUrl { get; set; } = "";

        /// <summary>
        /// Thời gian upload CV (chỉ đọc)
        /// </summary>
        [Display(Name = "Thời gian upload CV")]
        public DateTimeOffset? CvUploadedTime { get; set; }

        /// <summary>
        /// Thời gian upload CV hiển thị (chỉ đọc)
        /// </summary>
        public string CvUploadedTimeDisplay => CvUploadedTime?.ToString("dd/MM/yyyy HH:mm") ?? "";

        /// <summary>
        /// Có CV hay không (chỉ đọc)
        /// </summary>
        public bool HasCv => !string.IsNullOrEmpty(CvFileName) && !string.IsNullOrEmpty(CvFilePath);
        #endregion

        #region Helper Methods
        /// <summary>
        /// Format kích thước file để hiển thị
        /// </summary>
        /// <param name="bytes">Kích thước tính bằng bytes</param>
        /// <returns>Chuỗi hiển thị kích thước file</returns>
        private static string FormatFileSize(long bytes)
        {
            string[] sizes = { "B", "KB", "MB", "GB" };
            double len = bytes;
            int order = 0;
            while (len >= 1024 && order < sizes.Length - 1)
            {
                order++;
                len = len / 1024;
            }
            return $"{len:0.##} {sizes[order]}";
        }
        #endregion
    }
}
