using DataAnnotationsExtensions;
using Lada.Framework.Data.Enums;
using System.ComponentModel.DataAnnotations;

namespace Ladaer.BackEnd.Infrastructures.DTO.Models.Orders.Shared
{
    /// <summary>
    /// Đối tượng đại diện cho thông tin cập nhật địa chỉ đơn hàng.
    /// </summary>
    public class UpdateOrderAddressModel : IValidatableObject
    {
        /// <summary>
        /// Id của địa chỉ.
        /// </summary>
        public int Id { get; set; }

        /// <summary>
        /// Id của đơn hàng.
        /// </summary>
        public int OrderId { get; set; }

        /// <summary>
        /// Tên người liên hệ.
        /// </summary>
        [Required(ErrorMessage = "Tên người liên hệ không để trống")]
        public string Name { get; set; }

        /// <summary>
        /// Số điện thoại chính.
        /// </summary>
        [Required(ErrorMessage = "Số điện thoại không để trống")]
        [RegularExpression(@"^\d{10,15}$", ErrorMessage = "Số điện thoại không hợp lệ")]
        public string PhoneNumber1 { get; set; }

        /// <summary>
        /// Số điện thoại phụ.
        /// </summary>
        public string? PhoneNumber2 { get; set; }

        /// <summary>
        /// Địa chỉ chính.
        /// </summary>
        [Required(ErrorMessage = "Địa chỉ không để trống")]
        public string Address1 { get; set; }

        /// <summary>
        /// Địa chỉ phụ.
        /// </summary>
        public string? Address2 { get; set; }

        /// <summary>
        /// Loại địa chỉ.
        /// </summary>
        public AddressType AddressType { get; set; }

        /// <summary>
        /// Id của tỉnh/thành phố.
        /// </summary>
        [Required(ErrorMessage = "Tỉnh / thành phố không để trống")]
        [Min(1, ErrorMessage = "Chọn một Tỉnh / thành phố hợp lệ")]
        public int CityId { get; set; }

        /// <summary>
        /// Tên của tỉnh/thành phố.
        /// </summary>
        public string CityName { get; set; } = "";

        /// <summary>
        /// Id của quận/huyện.
        /// </summary>
        [Required(ErrorMessage = "Quận / huyện không để trống")]
        [Min(1, ErrorMessage = "Chọn một Quận / huyện hợp lệ")]
        public int DistrictId { get; set; }

        /// <summary>
        /// Tên của quận/huyện.
        /// </summary>
        public string DistrictName { get; set; } = "";

        /// <summary>
        /// Id của phường/xã.
        /// </summary>
        [Required(ErrorMessage = "Phường xã không để trống")]
        [Min(1, ErrorMessage = "Chọn một Phường xã hợp lệ")]
        public int WardId { get; set; }

        /// <summary>
        /// Tên của phường/xã.
        /// </summary>
        public string WardName { get; set; } = "";

        /// <summary>
        /// Ghi chú.
        /// </summary>
        public string Note { get; set; }

        /// <summary>
        /// Id của người cập nhật.
        /// </summary>
        public int UpdatedBy { get; set; }

        /// <summary>
        /// Tên người cập nhật.
        /// </summary>
        public string UpdatedByUserName { get; set; }

        /// <summary>
        /// Thời gian hẹn lấy/giao hàng.
        /// </summary>
        public DateTimeOffset? ScheduledTime { get; set; }

        /// <summary>
        /// Phương thức kiểm tra tính hợp lệ của đối tượng.
        /// </summary>
        /// <param name="validationContext">Ngữ cảnh kiểm tra tính hợp lệ.</param>
        /// <returns>Danh sách các kết quả kiểm tra tính hợp lệ.</returns>
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            if (!string.IsNullOrEmpty(PhoneNumber2))
            {
                // Nếu PhoneNumber2 được cung cấp, kiểm tra xem nó có đúng định dạng số điện thoại không
                if (!System.Text.RegularExpressions.Regex.IsMatch(PhoneNumber2, @"^\d{10,15}$"))
                {
                    yield return new ValidationResult("Số điện thoại 2 không hợp lệ", new[] { nameof(PhoneNumber2) });
                }
            }
        }
    }
}
