using Back.Data.Contracts;
using Back.Data.Models.Warehouse;
using Microsoft.EntityFrameworkCore;
using Shared.DTOs.Warehouse;
using Shared.Enums;

namespace Back.Services.Warehouse
{
    public class RemittanceService
    {
        private readonly IAsyncRepository<Remittance> _ReceiptRepo;

        public RemittanceService(IAsyncRepository<Remittance> remittanceRepo)
        {
            _ReceiptRepo = remittanceRepo;
        }

        public async Task<RemittanceDto?> ADD(RemittanceDto item)
        {
            var model = new Remittance()
            {
                Date = item.Date.Replace("/", ""),
                CODID = item.CODID,
                Count = item.Count,
                info = item.info,
                Type = item.Type,
                InvoiceID = item.InvoiceID,
                Deleted=false,
                CreateDt = DateTime.Now
            };
            var returnmodel = await _ReceiptRepo.AddAsync(model);
            if (returnmodel != null)
            {
                item.ID = returnmodel.ID;
                return item;
            }
            else
            {
                return null;
            }
        }
        public async Task AddRange(List<Remittance> items)
        {
            await _ReceiptRepo.AddRangeAsync(items);
        }
        public async Task<RemittanceDto?> Update(RemittanceDto item)
        {
            var model = await _ReceiptRepo.Get(w => w.ID == item.ID).FirstOrDefaultAsync();
            model.Date = item.Date.Replace("/", "");
            model.CODID = item.CODID;
            model.Count = item.Count;
            model.info = item.info;
            model.Type = item.Type;

            var returnmodel = await _ReceiptRepo.UpdateAsync(model);
            if (returnmodel)
            {
                return item;
            }
            else
            {
                return null;
            }
        }
        public async Task<bool> Delete(int itemID, int CompanyID)
        {
            var model = await _ReceiptRepo.Get(w => w.ID == itemID && w.cODItem.CompanyID == CompanyID && !w.Deleted).FirstOrDefaultAsync();
            model.Deleted = true;
            return await _ReceiptRepo.UpdateAsync(model);

        }
        public async Task<bool> DeleteByInvoiceID(int InvoiceID, int CompanyID)
        {
            var models = await _ReceiptRepo.Get(w => w.InvoiceID == InvoiceID && w.cODItem.CompanyID == CompanyID && !w.Deleted).ToListAsync();
            foreach (var model in models)
            model.Deleted = true;
            if(models.Any())
            return await _ReceiptRepo.UpdateRangeAsync(models);
            return true;
        }
        public async Task<bool> DeleteByCODIDAndInvoiceID(int InvoiceID, int CODID, int CompanyID)
        {
            var model = await _ReceiptRepo.Get(w => w.InvoiceID == InvoiceID && w.CODID == CODID && w.cODItem.CompanyID == CompanyID && !w.Deleted).FirstOrDefaultAsync();
            model.Deleted = true;
            return await _ReceiptRepo.UpdateAsync(model);


        }
        public async Task<RemittanceDto?> Get(int itemID, int CompanyID)
        {
            return await _ReceiptRepo.Get(w => w.ID == itemID && w.cODItem.CompanyID == CompanyID && !w.Deleted)
                .Include(inc => inc.cODItem)
                .Select(s => new RemittanceDto()
                {
                    Date = s.Date,
                    CODID = s.CODID,
                    Count = s.Count,
                    ID = s.ID,
                    CODTitle = s.cODItem.Title,
                    info = s.info,
                    Type = s.Type

                })
                .FirstOrDefaultAsync();



        }
        public async Task<List<RemittanceDto>?> GetAll(int CompanyID, TypeRemittance? Type = null, int CODID = 0)
        {
            var request = _ReceiptRepo.Get(w => w.cODItem.CompanyID == CompanyID && !w.Deleted);
            if (Type != null)
                request = request.Where(w => w.Type == Type);

            if (CODID != 0)
                request = request.Where(w => w.CODID == CODID);


            return await request
                .Include(inc => inc.cODItem)
                .Select(s => new RemittanceDto()
                {
                    Date = s.Date,
                    CODID = s.CODID,
                    Count = s.Count,
                    ID = s.ID,
                    CODTitle = s.cODItem.Title,
                    info = s.info,
                    Type = s.Type
                })
                .ToListAsync();



        }
        public async Task<bool> HasaRemittance(int InvoiceID)
        {
          return await _ReceiptRepo.Get(w => w.InvoiceID == InvoiceID && !w.Deleted).AnyAsync();
        }
        public async Task<bool> HasaRemittance(int InvoiceID,int CODID)
        {
            return await _ReceiptRepo.Get(w => w.InvoiceID == InvoiceID && w.CODID==CODID && !w.Deleted).AnyAsync();
        }
        public async Task<bool> ChangeRemittance(int InvoiceID, int CODID,int newnvoceID)
        {
            var item= await _ReceiptRepo.Get(w => w.InvoiceID == InvoiceID && w.CODID == CODID && !w.Deleted).FirstOrDefaultAsync();
            if (item!=null)
            {
                item.InvoiceID = newnvoceID;
                item.info = $"حواله خودکار از صورتحساب {newnvoceID}";
               return  await _ReceiptRepo.UpdateAsync(item);
            }
            return false;   
        }
        public async Task DeleteByInvoiceIDandCODID(int InvoiceID, int CODID)
        {
            var model = await _ReceiptRepo.Get(w => w.InvoiceID == InvoiceID && w.CODID == CODID && !w.Deleted).FirstOrDefaultAsync();
            model.Deleted = true;
           await _ReceiptRepo.UpdateAsync(model);

        }
    }
}
