package com.qxgmat.service.inline;

import com.github.pagehelper.Page;
import com.nuliji.tools.AbstractService;
import com.nuliji.tools.Tools;
import com.nuliji.tools.Transform;
import com.nuliji.tools.exception.ParameterException;
import com.nuliji.tools.exception.SystemException;
import com.nuliji.tools.mybatis.Example;
import com.qxgmat.data.constants.enums.module.ProductType;
import com.qxgmat.data.constants.enums.status.DirectionStatus;
import com.qxgmat.data.dao.UserOrderMapper;
import com.qxgmat.data.dao.entity.UserOrder;
import com.qxgmat.data.relation.UserOrderRelationMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserOrderService extends AbstractService {
    private static final Logger logger = LoggerFactory.getLogger(UserOrderService.class);

    @Resource
    private UserOrderMapper userOrderMapper;

    @Resource
    private UserOrderRelationMapper userOrderRelationMapper;

    private Map<String, String> adminMap = new HashMap<String, String>(){{
        put("", "uo");
    }};

    public Page<UserOrder> list(int page, int size, Integer userId, String order, DirectionStatus direction){
        Example example = new Example(UserOrder.class);
        if(userId != null){
            example.and(
                    example.createCriteria()
                            .andEqualTo("userId", userId)
            );
        }

        if(order == null || order.isEmpty()) order = "id";
        switch(direction){
            case ASC:
                example.orderBy(order).asc();
                break;
            case DESC:
            default:
                example.orderBy(order).desc();
        }
        return select(userOrderMapper, example, page, size);
    }

    public Page<UserOrder> listAdmin(int page, int size, Integer userId, String productType, String payMethod, Integer orderId, String order, DirectionStatus direction){
        if(order == null || order.isEmpty()){
            order = "id";
        }
        if(adminMap.containsKey(order)){
            order = adminMap.get(order)+".`"+Tools.underscoreName(order)+"`";
        }else{
            order = adminMap.get("")+".`"+Tools.underscoreName(order)+"`";
        }
        if (direction == null){
            direction = DirectionStatus.DESC;
        }
        String finalOrder = order;
        DirectionStatus finalDirection = direction;
        Page<UserOrder> p = page(()->{
            userOrderRelationMapper.listAdmin(userId, productType, payMethod, orderId, finalOrder, finalDirection.key);
        }, page, size);

        Collection ids = Transform.getIds(p, UserOrder.class, "id");

        // 获取详细数据
        List<UserOrder> list = select(ids);
        Transform.replace(p, list, UserOrder.class, "id");
        return p;
    }
    /**
     * 合并用户信息,将old转移至new
     * @param oldUserId
     * @param newUserId
     */
    public void mergeUser(Number oldUserId, Integer newUserId){
        Example example = new Example(UserOrder.class);
        example.and(
                example.createCriteria().andEqualTo("userId", oldUserId)
        );
        update(userOrderMapper, example, UserOrder.builder().userId(newUserId).build());
    }

    public UserOrder add(UserOrder pay){
        int result = insert(userOrderMapper, pay);
        pay = one(userOrderMapper, pay.getId());
        if(pay == null){
            throw new SystemException("支付添加失败");
        }
        return pay;
    }

    public UserOrder edit(UserOrder pay){
        UserOrder in = one(userOrderMapper, pay.getId());
        if(in == null){
            throw new ParameterException("支付记录不存在");
        }
        int result = update(userOrderMapper, pay);
        return pay;
    }

    public boolean delete(Number id){
        UserOrder in = one(userOrderMapper, id);
        if(in == null){
            throw new ParameterException("支付记录不存在");
        }
        int result = delete(userOrderMapper, id);
        return result > 0;
    }

    public UserOrder get(Number id){
        UserOrder in = one(userOrderMapper, id);

        if(in == null){
            throw new ParameterException("支付记录不存在");
        }
        return in;
    }

    public Page<UserOrder> select(int page, int pageSize){
        return select(userOrderMapper, page, pageSize);
    }

    public Page<UserOrder> select(Integer[] ids){
        return page(()->select(userOrderMapper, ids), 1, ids.length);
    }

    public List<UserOrder> select(Collection ids){
        return select(userOrderMapper, ids);
    }

}