using Lada.Framework.Data.Domains.Finance;
using Lada.Framework.Data.Enums;
using Lada.Framework.DTO;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Finances;
using System.ComponentModel.DataAnnotations;

namespace Ladaer.BackEnd.Infrastructures.DTO.Models.Finances
{
    /// <summary>
    /// Model cho import sao kê ngân hàng
    /// </summary>
    public class BankStatementImportModel
    {
        /// <summary>
        /// ID tài khoản ngân hàng
        /// </summary>
        [Required(ErrorMessage = "ID tài khoản ngân hàng không được để trống")]
        public int BankAccountId { get; set; }

        /// <summary>
        /// File Excel sao kê
        /// </summary>
        [Required(ErrorMessage = "File Excel không được để trống")]
        public IFormFile ExcelFile { get; set; } = null!;



        /// <summary>
        /// Có ghi đè dữ liệu trùng lặp không
        /// </summary>
        public bool OverwriteExisting { get; set; } = false;

        /// <summary>
        /// Ngày bắt đầu lọc dữ liệu (optional)
        /// </summary>
        public DateTimeOffset? FromDate { get; set; }

        /// <summary>
        /// Ngày kết thúc lọc dữ liệu (optional)
        /// </summary>
        public DateTimeOffset? ToDate { get; set; }

        /// <summary>
        /// Có tự động phân loại giao dịch không
        /// </summary>
        public bool AutoCategorize { get; set; } = true;

        /// <summary>
        /// Có cập nhật số dư tài khoản không
        /// </summary>
        public bool UpdateAccountBalance { get; set; } = true;
    }

    /// <summary>
    /// Kết quả import sao kê ngân hàng
    /// </summary>
    public class BankStatementImportResult : BaseResult
    {
        /// <summary>
        /// ID import
        /// </summary>
        public Guid ImportId { get; set; }

        /// <summary>
        /// Tổng số dòng
        /// </summary>
        public int TotalRows { get; set; }

        /// <summary>
        /// Số dòng xử lý thành công
        /// </summary>
        public int ProcessedRows { get; set; }

        /// <summary>
        /// Số dòng lỗi
        /// </summary>
        public int ErrorRows { get; set; }

        /// <summary>
        /// Số dòng bỏ qua
        /// </summary>
        public int SkippedRows { get; set; }

        /// <summary>
        /// Số dòng trùng lặp
        /// </summary>
        public int DuplicateRows { get; set; }

        /// <summary>
        /// Danh sách thông báo lỗi
        /// </summary>
        public List<string> ErrorMessages { get; set; } = new List<string>();

        /// <summary>
        /// Danh sách cảnh báo
        /// </summary>
        public List<string> WarningMessages { get; set; } = new List<string>();

        /// <summary>
        /// Danh sách giao dịch đã import
        /// </summary>
        public List<BankTransactionItem> ImportedTransactions { get; set; } = new List<BankTransactionItem>();

        /// <summary>
        /// Thời gian xử lý (milliseconds)
        /// </summary>
        public long ProcessingTimeMs { get; set; }

        /// <summary>
        /// Số dư tài khoản sau khi import
        /// </summary>
        public decimal? FinalBalance { get; set; }

        /// <summary>
        /// Ngày giao dịch đầu tiên
        /// </summary>
        public DateTimeOffset? FirstTransactionDate { get; set; }

        /// <summary>
        /// Ngày giao dịch cuối cùng
        /// </summary>
        public DateTimeOffset? LastTransactionDate { get; set; }
    }

    /// <summary>
    /// Model tìm kiếm import sao kê
    /// </summary>
    public class BankStatementImportSearchModel
    {
        /// <summary>
        /// Từ khóa tìm kiếm
        /// </summary>
        public string? Keyword { get; set; }

        /// <summary>
        /// ID tài khoản ngân hàng
        /// </summary>
        public int? BankAccountId { get; set; }

        /// <summary>
        /// Mã ngân hàng
        /// </summary>
        public BankCode? BankCode { get; set; }

        /// <summary>
        /// Trạng thái import
        /// </summary>
        public ImportStatus? ImportStatus { get; set; }

        /// <summary>
        /// Ngày import từ
        /// </summary>
        public DateTimeOffset? ImportDateFrom { get; set; }

        /// <summary>
        /// Ngày import đến
        /// </summary>
        public DateTimeOffset? ImportDateTo { get; set; }

        /// <summary>
        /// Người thực hiện import
        /// </summary>
        public int? ImportedByUserId { get; set; }
    }

    /// <summary>
    /// Kết quả parse file sao kê
    /// </summary>
    public class BankStatementParseResult
    {
        /// <summary>
        /// Có thành công không
        /// </summary>
        public bool IsSuccess { get; set; }

        /// <summary>
        /// Thông báo lỗi chính
        /// </summary>
        public string ErrorMessage { get; set; } = string.Empty;

        /// <summary>
        /// Danh sách thông báo lỗi chi tiết
        /// </summary>
        public List<string> ErrorMessages { get; set; } = new List<string>();

        /// <summary>
        /// Tổng số dòng
        /// </summary>
        public int TotalRows { get; set; }

        /// <summary>
        /// Số dòng xử lý thành công
        /// </summary>
        public int ProcessedRows { get; set; }

        /// <summary>
        /// Số dòng lỗi
        /// </summary>
        public int ErrorRows { get; set; }

        /// <summary>
        /// Danh sách giao dịch đã parse
        /// </summary>
        public List<BankTransaction> Transactions { get; set; } = new List<BankTransaction>();
    }
}
