using System;
using System.Linq.Expressions;
using Mapster.Models;
using NetinaShop.Domain.Dtos.SmallDtos;
using NetinaShop.Domain.Entities.Accounting;
using NetinaShop.Domain.Entities.Orders;
using NetinaShop.Domain.Entities.Users;

namespace NetinaShop.Domain.Mappers
{
    public static partial class PaymentMapper
    {
        public static Payment AdaptToPayment(this PaymentSDto p1)
        {
            return p1 == null ? null : new Payment()
            {
                FactorNumber = p1.FactorNumber,
                Amount = p1.Amount,
                Description = p1.Description,
                TransactionCode = p1.TransactionCode,
                CardPan = p1.CardPan,
                Authority = p1.Authority,
                Type = p1.Type,
                Status = p1.Status,
                OrderId = p1.OrderId,
                Order = new Order() {Id = p1.OrderId},
                UserId = p1.UserId,
                User = new ApplicationUser()
                {
                    Id = p1.UserId,
                    PhoneNumber = p1.UserPhoneNumber
                },
                Id = p1.Id,
                CreatedAt = p1.CreatedAt
            };
        }
        public static Payment AdaptTo(this PaymentSDto p2, Payment p3)
        {
            if (p2 == null)
            {
                return null;
            }
            Payment result = p3 ?? new Payment();
            
            result.FactorNumber = p2.FactorNumber;
            result.Amount = p2.Amount;
            result.Description = p2.Description;
            result.TransactionCode = p2.TransactionCode;
            result.CardPan = p2.CardPan;
            result.Authority = p2.Authority;
            result.Type = p2.Type;
            result.Status = p2.Status;
            result.OrderId = p2.OrderId;
            result.Order = funcMain1(new Never(), result.Order, p2);
            result.UserId = p2.UserId;
            result.User = funcMain2(new Never(), result.User, p2);
            result.Id = p2.Id;
            result.CreatedAt = p2.CreatedAt;
            return result;
            
        }
        public static PaymentSDto AdaptToSDto(this Payment p8)
        {
            return p8 == null ? null : new PaymentSDto()
            {
                FactorNumber = p8.FactorNumber,
                Amount = p8.Amount,
                Description = p8.Description,
                TransactionCode = p8.TransactionCode,
                CardPan = p8.CardPan,
                Authority = p8.Authority,
                Type = p8.Type,
                Status = p8.Status,
                OrderId = p8.OrderId,
                UserId = p8.UserId,
                UserFullName = p8.User != null ? p8.User.FirstName + " " + p8.User.LastName : string.Empty,
                UserPhoneNumber = p8.User != null ? p8.User.PhoneNumber : string.Empty,
                Id = p8.Id,
                CreatedAt = p8.CreatedAt
            };
        }
        public static PaymentSDto AdaptTo(this Payment p9, PaymentSDto p10)
        {
            if (p9 == null)
            {
                return null;
            }
            PaymentSDto result = p10 ?? new PaymentSDto();
            
            result.FactorNumber = p9.FactorNumber;
            result.Amount = p9.Amount;
            result.Description = p9.Description;
            result.TransactionCode = p9.TransactionCode;
            result.CardPan = p9.CardPan;
            result.Authority = p9.Authority;
            result.Type = p9.Type;
            result.Status = p9.Status;
            result.OrderId = p9.OrderId;
            result.UserId = p9.UserId;
            result.UserFullName = p9.User != null ? p9.User.FirstName + " " + p9.User.LastName : string.Empty;
            result.UserPhoneNumber = p9.User != null ? p9.User.PhoneNumber : string.Empty;
            result.Id = p9.Id;
            result.CreatedAt = p9.CreatedAt;
            return result;
            
        }
        public static Expression<Func<Payment, PaymentSDto>> ProjectToSDto => p11 => new PaymentSDto()
        {
            FactorNumber = p11.FactorNumber,
            Amount = p11.Amount,
            Description = p11.Description,
            TransactionCode = p11.TransactionCode,
            CardPan = p11.CardPan,
            Authority = p11.Authority,
            Type = p11.Type,
            Status = p11.Status,
            OrderId = p11.OrderId,
            UserId = p11.UserId,
            UserFullName = p11.User != null ? p11.User.FirstName + " " + p11.User.LastName : string.Empty,
            UserPhoneNumber = p11.User != null ? p11.User.PhoneNumber : string.Empty,
            Id = p11.Id,
            CreatedAt = p11.CreatedAt
        };
        
        private static Order funcMain1(Never p4, Order p5, PaymentSDto p2)
        {
            Order result = p5 ?? new Order();
            
            result.Id = p2.OrderId;
            return result;
            
        }
        
        private static ApplicationUser funcMain2(Never p6, ApplicationUser p7, PaymentSDto p2)
        {
            ApplicationUser result = p7 ?? new ApplicationUser();
            
            result.Id = p2.UserId;
            result.PhoneNumber = p2.UserPhoneNumber;
            return result;
            
        }
    }
}