using System.ComponentModel.DataAnnotations;
using Lada.Framework.Data.Domains.Finance;

namespace Ladaer.BackEnd.Infrastructures.DTO.Models.Finances
{
    /// <summary>
    /// Model tạo đối soát mới
    /// </summary>
    public class CreateReconciliationModel
    {
        /// <summary>
        /// ID khách hàng
        /// </summary>
        [Required(ErrorMessage = "Vui lòng chọn khách hàng")]
        public int CustomerId { get; set; }

        /// <summary>
        /// Từ ngày
        /// </summary>
        [Required(ErrorMessage = "Vui lòng chọn từ ngày")]
        public DateTimeOffset FromDate { get; set; }

        /// <summary>
        /// Đến ngày
        /// </summary>
        [Required(ErrorMessage = "Vui lòng chọn đến ngày")]
        public DateTimeOffset ToDate { get; set; }

        /// <summary>
        /// Danh sách ID đơn hàng được chọn để đối soát
        /// </summary>
        [Required(ErrorMessage = "Vui lòng chọn ít nhất một đơn hàng")]
        [MinLength(1, ErrorMessage = "Vui lòng chọn ít nhất một đơn hàng")]
        public List<int> OrderIds { get; set; } = new List<int>();

        /// <summary>
        /// Ghi chú đối soát
        /// </summary>
        [MaxLength(1024, ErrorMessage = "Ghi chú không được vượt quá 1024 ký tự")]
        public string Note { get; set; } = string.Empty;

        /// <summary>
        /// Số tài khoản ngân hàng
        /// </summary>
        [MaxLength(64, ErrorMessage = "Số tài khoản không được vượt quá 64 ký tự")]
        public string BankAccountNumber { get; set; } = string.Empty;

        /// <summary>
        /// Tên chủ tài khoản
        /// </summary>
        [MaxLength(256, ErrorMessage = "Tên chủ tài khoản không được vượt quá 256 ký tự")]
        public string BankAccountHolderName { get; set; } = string.Empty;

        /// <summary>
        /// Mã ngân hàng
        /// </summary>
        [MaxLength(16, ErrorMessage = "Mã ngân hàng không được vượt quá 16 ký tự")]
        public string BankCode { get; set; } = string.Empty;

        /// <summary>
        /// Tên ngân hàng
        /// </summary>
        [MaxLength(256, ErrorMessage = "Tên ngân hàng không được vượt quá 256 ký tự")]
        public string BankName { get; set; } = string.Empty;

        /// <summary>
        /// Tên chi nhánh ngân hàng
        /// </summary>
        [MaxLength(256, ErrorMessage = "Tên chi nhánh không được vượt quá 256 ký tự")]
        public string BankBranchName { get; set; } = string.Empty;

        /// <summary>
        /// Địa chỉ chi nhánh ngân hàng
        /// </summary>
        [MaxLength(512, ErrorMessage = "Địa chỉ chi nhánh không được vượt quá 512 ký tự")]
        public string BankBranchAddress { get; set; } = string.Empty;

        /// <summary>
        /// Thông tin chuyển khoản bổ sung
        /// </summary>
        [MaxLength(1024, ErrorMessage = "Thông tin chuyển khoản không được vượt quá 1024 ký tự")]
        public string TransferInfo { get; set; } = string.Empty;

        /// <summary>
        /// Tự động xác nhận sau khi tạo
        /// </summary>
        public bool AutoConfirm { get; set; } = false;

        /// <summary>
        /// Loại phiếu đối soát
        /// </summary>
        public ReconciliationType Type { get; set; } = ReconciliationType.CollectMoney;

        /// <summary>
        /// ID thông tin xuất hóa đơn VAT (tùy chọn)
        /// </summary>
        public int? VatInfoId { get; set; }

        /// <summary>
        /// Người tạo (sẽ được set từ controller)
        /// </summary>
        public int CreatedBy { get; set; }

        /// <summary>
        /// Tên người tạo (sẽ được set từ controller)
        /// </summary>
        public string CreatedByUsername { get; set; } = string.Empty;

        /// <summary>
        /// Validate model
        /// </summary>
        /// <returns></returns>
        public List<string> Validate()
        {
            var errors = new List<string>();

            if (CustomerId <= 0)
            {
                errors.Add("Vui lòng chọn khách hàng");
            }

            if (FromDate >= ToDate)
            {
                errors.Add("Từ ngày phải nhỏ hơn đến ngày");
            }

            if (ToDate > DateTimeOffset.Now)
            {
                errors.Add("Đến ngày không được lớn hơn ngày hiện tại");
            }

            if (OrderIds == null || !OrderIds.Any())
            {
                errors.Add("Vui lòng chọn ít nhất một đơn hàng");
            }

            if (OrderIds != null && OrderIds.Distinct().Count() != OrderIds.Count)
            {
                errors.Add("Danh sách đơn hàng có ID trùng lặp");
            }

            // Validate thông tin tài khoản ngân hàng (không bắt buộc khi tạo, có thể cập nhật sau)
            if (!string.IsNullOrEmpty(BankAccountNumber))
            {
                if (string.IsNullOrWhiteSpace(BankAccountHolderName))
                {
                    errors.Add("Vui lòng nhập tên chủ tài khoản");
                }

                if (string.IsNullOrWhiteSpace(BankCode))
                {
                    errors.Add("Vui lòng nhập mã ngân hàng");
                }

                if (string.IsNullOrWhiteSpace(BankName))
                {
                    errors.Add("Vui lòng nhập tên ngân hàng");
                }
            }

            return errors;
        }
    }
}
