using System;
using System.Collections.Generic;
using System.Linq;
using BBWY.Client.Models.Statistics.AfterSaleOrder;

namespace BBWY.Client.Models
{
    public class Order : NotifyObject
    {
        public Order()
        {
            OrderCostDetailGroupList = new List<OrderCostDetailGroup>();
            AfterSaleOrderGroupList = new List<AfterSaleOrderGroup>();
        }

        private StorageType? storageType;
        private OrderState orderState;
        private string waybillNo;
        private string venderRemark;
        private string flag;

        public string Id { get; set; }

        /// <summary>
        /// 商家Id
        /// </summary>
        public string VenderId { get; set; }

        /// <summary>
        /// 下单时间
        /// </summary>
        public DateTime OrderStartTime { get; set; }

        /// <summary>
        /// 结单时间
        /// </summary>
        public DateTime? OrderEndTime { get; set; }

        /// <summary>
        /// 买家账号
        /// </summary>
        public string BuyerAccount { get; set; }

        /// <summary>
        /// 订单平台
        /// </summary>
        public Platform Platform { get; set; }

        /// <summary>
        /// 订单类型
        /// </summary>
        public OrderType OrderType { get; set; }

        /// <summary>
        /// 支付方式
        /// </summary>
        public PayType PayType { get; set; }


        /// <summary>
        /// 订单状态中文说明
        /// </summary>
        public string OrderStateText { get; set; }

        /// <summary>
        /// 订单总价
        /// </summary>
        public decimal OrderTotalPrice { get; set; }

        /// <summary>
        /// 订单货款金额
        /// </summary>
        public decimal OrderSellerPrice { get; set; }

        /// <summary>
        /// 用户应付金额
        /// </summary>
        public decimal OrderPayment { get; set; }

        /// <summary>
        /// 商品运费(用户付)
        /// </summary>
        public decimal FreightPrice { get; set; }

        /// <summary>
        /// 实收金额
        /// </summary>
        public decimal ActualAmount { get { return OrderSellerPrice + FreightPrice; } }

        /// <summary>
        /// 商家优惠金额
        /// </summary>
        public decimal PreferentialAmount { get; set; }

        /// <summary>
        /// 买家备注
        /// </summary>
        public string BuyerRemark { get; set; }

        /// <summary>
        /// 采购备注
        /// </summary>
        public string PurchaseRemark { get; set; }

        /// <summary>
        /// 仓储类型
        /// </summary>
        public StorageType? StorageType
        {
            get => storageType;
            set
            {
                Set(ref storageType, value);
            }
        }

        /// <summary>
        /// 仓库名称
        /// </summary>
        public string StoreName { get; set; }

        /// <summary>
        /// 刷单类型
        /// </summary>
        public SDType? SDType { get; set; }

        /// <summary>
        /// 刷单关键词
        /// </summary>
        public string SDKey { get; set; }

        /// <summary>
        /// 刷单支付渠道
        /// </summary>
        public PayBillType? SDPayChannel { get; set; }

        /// <summary>
        /// 刷单交易账单号
        /// </summary>
        public string SDPayBillNo { get; set; }

        /// <summary>
        /// 刷单人
        /// </summary>
        public string SDOperator { get; set; }

        /// <summary>
        /// 订单状态
        /// </summary>
        public OrderState OrderState { get => orderState; set { Set(ref orderState, value); } }

        public string WaybillNo { get => waybillNo; set { Set(ref waybillNo, value); } }

        /// <summary>
        /// 商家备注
        /// </summary>
        public string VenderRemark { get => venderRemark; set { Set(ref venderRemark, value); } }

        /// <summary>
        /// 订单旗帜
        /// </summary>
        public string Flag { get => flag; set { Set(ref flag, value); } }

        /// <summary>
        /// 是否包含售后单
        /// </summary>
        public bool IsAfterSaleOrder { get; set; }

        /// <summary>
        /// 收货人信息
        /// </summary>
        public Consignee Consignee { get; set; }

        /// <summary>
        /// 订单成本
        /// </summary>
        public OrderCost OrderCost { get; set; }

        public IList<OrderSku> ItemList { get; set; }

        /// <summary>
        /// 优惠券列表
        /// </summary>
        public IList<OrderCoupon> OrderCouponList { get; set; }

        /// <summary>
        /// 订单成本明细列表
        /// </summary>
        public IList<OrderCostDetail> OrderCostDetailList { get; set; }

        /// <summary>
        /// 订单成本明细分组列表
        /// </summary>
        public IList<OrderCostDetailGroup> OrderCostDetailGroupList { get; set; }

        /// <summary>
        /// 代发信息
        /// </summary>
        public IList<OrderDropShipping> OrderDropShippingList { get; set; }

        /// <summary>
        /// 历史代发信息
        /// </summary>
        public IList<OrderDropShipping> HistoryOrderDropShippingList { get; set; }

        /// <summary>
        /// 售后信息
        /// </summary>
        public IList<AfterSaleOrder> AfterSaleOrderList { get; set; }

        /// <summary>
        ///售后信息分组
        /// </summary>
        public IList<AfterSaleOrderGroup> AfterSaleOrderGroupList { get; set; }

        /// <summary>
        /// 是否为异常订单
        /// </summary>
        public bool IsCostException
        {
            get
            {
                var beforeTotalCost = OrderCost?.BeforeTotalCost ?? 0M;
                return OrderState != OrderState.已取消 && StorageType != Models.StorageType.SD &&
                       ((StorageType != null && beforeTotalCost == 0M) ||
                        (beforeTotalCost > OrderSellerPrice + FreightPrice) ||
                        (StorageType == null && OrderState != OrderState.等待采购 && OrderState != OrderState.待付款));
            }
        }

        public void LocalConvert()
        {
            ConvertAfterSaleOrderToGroup();
            ConvertOrderCostDetailToGroup();
        }

        public void ConvertOrderCostDetailToGroup()
        {
            if (OrderCostDetailList == null || OrderCostDetailList.Count() == 0)
                return;
            foreach (var detail in OrderCostDetailList)
            {
                var group = OrderCostDetailGroupList.FirstOrDefault(g => g.SkuId == detail.SkuId);
                if (group == null)
                {
                    group = new OrderCostDetailGroup() { SkuId = detail.SkuId };
                    OrderCostDetailGroupList.Add(group);
                }
                group.Items.Add(detail);
            }
        }

        private void ConvertAfterSaleOrderToGroup()
        {
            if (!IsAfterSaleOrder || AfterSaleOrderList == null || AfterSaleOrderList.Count() == 0)
                return;
            foreach (var aso in AfterSaleOrderList)
            {
                var group = AfterSaleOrderGroupList.FirstOrDefault(g => g.SkuId == aso.SkuId);
                if (group == null)
                {
                    group = new AfterSaleOrderGroup() { SkuId = aso.SkuId };
                    AfterSaleOrderGroupList.Add(group);
                }
                group.Items.Add(aso);
            }
        }
    }

    public class OrderList
    {
        public int Count { get; set; }

        public IList<Order> Items { get; set; }
    }
}