using TIAM.Core.Enums;
using TIAM.Database.DataLayers.Admins;
using TIAM.Database.DataLayers.Users;
using TIAM.Entities.Products;
using TIAM.Entities.Transfers;

namespace TIAMWebApp.Server.Services
{
    public class TransferBackendService
    {
        private readonly IConfiguration _configuration;
        private readonly AdminDal _adminDal;

        public TransferBackendService(IConfiguration configuration, AdminDal adminDal)
        {
            _configuration = configuration;
            _adminDal = adminDal;
        }

        public double GetTransferPrice(Guid productId, Guid fromTransferDestinationId, Guid toTranferDestinationId, in byte seatNumber)
        {
            throw new NotImplementedException();
        }

        public double GetTransferPrice(Guid productId, TransferDestination fromTransferDestination, TransferDestination toTransferDestination, in byte seatNumber)
        {
            var product = _adminDal.GetProductById(productId);

            if (product == null) return -1;

            return GetTransferPrice(product, fromTransferDestination, toTransferDestination, in seatNumber);
        }

        public double GetTransferPrice(Product product, TransferDestination fromTransferDestination, TransferDestination toTransferDestination, in byte seatNumber)
        {
            var baseDestination = product.Profile.AddressId == fromTransferDestination.AddressId ? toTransferDestination : fromTransferDestination;

            var transferDestinationToProduct = _adminDal.GetTransferDestinationToProduct(product.Id, baseDestination.Id);

            var tranferDestinationPrice = transferDestinationToProduct ?? baseDestination as ITransfeDestinationPrices;

            var price = GetSeatNumberPrice(in tranferDestinationPrice, seatNumber);

            //TODO: ExtraPrice - J. seatnum percent price, FirstName, LastName, CascadeDelete
            //if (baseDestination.Id == fromTransferDestination.Id && )
            return price;
        }

        public double GetSeatNumberPrice(in ITransfeDestinationPrices transfeDestinationPrices, in byte seatNumber)
            => GetSeatNumberPrice(transfeDestinationPrices.Price, transfeDestinationPrices.Price2, transfeDestinationPrices.Price3, seatNumber);

        public double GetSeatNumberPrice(double price, in double? price2, in double? price3, in byte seatNumber)
        {
            return seatNumber switch
            {
                >= (byte)SeatNumberPriceType.Price3SeatNum => price3 ?? price //TODO: price * seatnum percent - J.
                ,
                >= (byte)SeatNumberPriceType.Price2SeatNum => price2 ?? price //TODO: price * seatnum percent - J.
                ,
                _ => price
            };
        }

    }
}
