using Lada.Framework.Data.Domains.Finance;
using Lada.Framework.Data.Repositories;
using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO;
using Ladaer.BackEnd.Infrastructures.DTO.Items.Finance;

namespace Ladaer.BackEnd.Infrastructures.Services.Finances
{
    /// <summary>
    /// Service quản lý hóa đơn VAT nội bộ (CRUD)
    /// </summary>
    public class VatInvoiceService : IVatInvoiceService
    {
        private readonly IRepository<VatInvoice> _repository;

        public VatInvoiceService(IRepository<VatInvoice> repository)
        {
            _repository = repository;
        }

        /// <summary>
        /// Tìm kiếm hóa đơn VAT
        /// </summary>
        public async Task<SmartTableResult<VatInvoiceItem>> Search(SmartTableParam param)
        {
            var query = _repository.Query();

            // Áp dụng filter từ param
            if (param.Search.PredicateObject != null)
            {
                dynamic search = param.Search.PredicateObject;

                // Tìm kiếm theo keyword
                if (search.Keyword != null)
                {
                    string keyword = search.Keyword.ToString().Trim().ToLower();
                    query = query.Where(x =>
                        x.InvoiceNumber.ToLower().Contains(keyword) ||
                        x.SellerName.ToLower().Contains(keyword) ||
                        x.BuyerName.ToLower().Contains(keyword) ||
                        x.SellerTaxCode.ToLower().Contains(keyword) ||
                        x.BuyerTaxCode.ToLower().Contains(keyword));
                }

                // Filter theo ngày lập
                if (search.FromDate != null && search.ToDate != null)
                {
                    DateTimeOffset from = search.FromDate;
                    DateTimeOffset to = search.ToDate;
                    query = query.Where(x => x.IssueDate >= from && x.IssueDate <= to);
                }

                // Filter theo MST người bán
                if (search.SellerTaxCode != null)
                {
                    string sellerTaxCode = search.SellerTaxCode.ToString().Trim();
                    query = query.Where(x => x.SellerTaxCode == sellerTaxCode);
                }

                // Filter theo MST người mua
                if (search.BuyerTaxCode != null)
                {
                    string buyerTaxCode = search.BuyerTaxCode.ToString().Trim();
                    query = query.Where(x => x.BuyerTaxCode == buyerTaxCode);
                }

                // Filter theo tình trạng
                if (search.Status != null)
                {
                    int status = Convert.ToInt32(search.Status);
                    query = query.Where(x => x.Status == status);
                }

                // Filter theo chiều hóa đơn (1=Bán ra, 2=Mua vào)
                if (search.InvoiceDirection != null)
                {
                    int direction = Convert.ToInt32(search.InvoiceDirection);
                    query = query.Where(x => x.InvoiceDirection == direction);
                }

                // Filter theo kết quả kiểm tra (ttxly)
                if (search.InvoiceCheckResult != null)
                {
                    int checkResult = Convert.ToInt32(search.InvoiceCheckResult);
                    query = query.Where(x => x.InvoiceCheckResult == checkResult);
                }
            }

            // Sắp xếp mặc định theo ngày đồng bộ giảm dần
            if (param.Sort == null || string.IsNullOrEmpty(param.Sort.Predicate))
            {
                param.Sort = new Sort { Predicate = "SyncTime", Reverse = true };
            }

            // Trả về kết quả với AutoMapper
            return await query.ToSmartTableResultAsync(param, x => x.ToItem());
        }
    }
}
