import functools


def sortRequests(requests, price_reverse=False):
    """
    將請求做排序，排序優先順序為: 價格(越高越前) -> 數量(越少越前) -> 時間(越早越前)
    XXX_requests -> [guid, stock_id, date_time, price, volumn]

    :param requests: 所有請求
    :param price_reverse: 反轉價格，越低排越前面。
    :return:
    """

    def compareRequests(r1, r2):
        """
        sorted()也是一個高階函式，它可以接收一個比較函式來實現自定義排序，
        比較函式的定義是，傳入兩個待比較的元素 x, y，
        如果 x 應該排在 y 的前面，返回 -1，
        如果 x 應該排在 y 的後面，返回 1。
        如果 x 和 y 相等，返回 0。

        def customSort(x, y):
            if x > y:
                return -1
            if x < y:
                return 1
            return 0

        print(sorted([2,4,5,7,3], key=functools.cmp_to_key(customSort)))
        -> [7, 5, 4, 3, 2]

        :param r1: 請求 1
        :param r2: 請求 2
        :return:
        """
        # guid, stock_id, date_time, price, volumn = request
        # guid 和 stock_id 與排序無關
        _, _, time1, price1, volumn1 = r1
        _, _, time2, price2, volumn2 = r2

        # 價格越低排越前面
        if price_reverse:
            if price1 < price2:
                return -1
            elif price1 > price2:
                return 1
        # 價格越高排越前面
        else:
            if price1 > price2:
                return -1
            elif price1 < price2:
                return 1

        # 數量少的排前面
        if volumn1 < volumn2:
            return -1

        # 數量多的排後面
        elif volumn1 > volumn2:
            return 1
        else:
            # 時間早的排前面
            if time1 < time2:
                return -1

            # 時間晚的排後面
            elif time1 > time2:
                return 1

        return 0

    # 透過自定義規則函式 compareRequests 來對 requests 來進行排序
    return sorted(requests, key=functools.cmp_to_key(compareRequests))