package com.ruoyi.common.core.utils;

import com.ruoyi.common.core.exception.ServiceException;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;

/**
 * @author otto
 */
public class SortUtils {
    public static List<?> sort(List<?> list, final String param, boolean isAsc) {
        //自定义Comparator对象，自定义排序
        Comparator c = (o1, o2) -> {
            try {
                Field field1 = o1.getClass().getDeclaredField(param);
                Field field2 = o2.getClass().getDeclaredField(param);
                field1.setAccessible(true);
                field2.setAccessible(true);
                if (Integer.class.equals(field1.getType())) {
                    if ((Integer) field1.get(o1) < (Integer) field2.get(o2)) {
                        return isAsc ? -1 : 1;
                    } else {
                        //注意！！返回值必须是一对相反数，否则无效。jdk1.7以后就是这样。
                        return isAsc ? 1 : -1;
                    }
                }
                if (Long.class.equals(field1.getType())) {
                    Long long1 = (Long) field1.get(o1);
                    Long long2 = (Long) field2.get(o2);
                    if (long1 < long2) {
                        return isAsc ? -1 : 1;
                    } else {
                        //注意！！返回值必须是一对相反数，否则无效。jdk1.7以后就是这样。
                        return isAsc ? 1 : -1;
                    }
                }
                if (Date.class.equals(field1.getType())) {
                    Date date1 = (Date) field1.get(o1);
                    Date date2 = (Date) field2.get(o2);
                    if (date1.before(date2)) {
                        return isAsc ? -1 : 1;
                    } else {
                        //注意！！返回值必须是一对相反数，否则无效。jdk1.7以后就是这样。
                        return isAsc ? 1 : -1;
                    }
                }

            } catch (NoSuchFieldException e) {
                throw new ServiceException(String.format("指定的排序字段不存在[%s]", param));
            } catch (IllegalAccessException e) {
                throw new ServiceException(String.format("访问排序字段非法,请检查排序字段[%s]权限", param));
            }
            return 1;
        };
        Collections.sort(list, c);
        return list;

    }
}
