What will be on the top of this decorative calendar? Someone gave my wife a decorative calendar consisting of four cubes. Here it is showing today's date (as of the posting of this challenge) on the front:



When I first saw it, I looked at it from the wrong angle (from directly above) and couldn't figure out why it gave this information:

[["February", "January"], [3], [7], ["Monday", "Tuesday"]]


Your job is to replicate my error for any date in 2019.

Challenge

Write a program or function that takes any date from 2019, and outputs what appears on the top of all the cubes when that date is displayed facing out from the front of the calendar.

Here are all six sides for all the cubes. To display a 6 you just turn the 9 upside down. The 0 is vertically symmetrical, so 0 upside down is still 0. There might be more than one correct answer for some dates (e.g. any 11th of any month will have more than one way to use the cubes, and the 0 thing) so you can output any correct answer.



Rules


Standard loopholes forbidden.
Input/output format is flexible.
The output does have to be in order by cube, but not within a cube. The order must be month cube first, then the two number cubes, followed by the weekday cube. But when a cube has two elements on top, those two elements can be in either order.
You can replace January to December 0-11 or 1-12 if you like. 
You can replace the days of the week with 0-6 or 1-7 if you like, and you can start the week on either Sunday or Monday (but you can't start the week on any other day - this is PPGC, not some sort of crazy-town.)
This is code-colf. Fewest bytes for each language wins.
Explanations encouraged.


Test cases

(Tue) 2019-01-29   [[ "July", "August" ], [3], [7], [ "Thursday", "Wednesday" ]]
                   [[ "August", "July" ], [3], [7], [ "Wednesday", "Thursday" ]]

                   etc. since the order within each cube doesn't matter.


(Thu) 2019-07-11   [[ "May", "June" ], [3], [8], [ "Saturday", "Friday" ]]
                   [[ "May", "June" ], [8], [3], [ "Saturday", "Friday" ]]

                   since the two 1 cubes could be either way.

(Sun) 2019-10-27   [[ "January", "February" ], [3], [6], [ "Friday", "Saturday" ]]

(Wed) 2019-05-01   [[ "March", "April" ], [8], [3], [ "Monday", "Tuesday" ]]
                   [[ "March", "April" ], [6], [3], [ "Monday", "Tuesday" ]]
                   [[ "March", "April" ], [9], [3], [ "Monday", "Tuesday" ]]

                   since the 0 cube could have either the 8 side or the 6 side facing up, and the 6 could also be considered a 9.


(Sat) 2019-08-24   [[ "February", "January" ], [8], [5], [ "Sunday" ]]
C (glibc), 327 319 286 bytes

#define C strftime(s
#define U(B,E)S[6]=E-1,C+B,99,"%A"+2*!E,S)
S[9],s[99];f(M,D){S[4]=112233107696&gt;&gt;3*M&amp;7;C,9,"%B",S);S[4]^=1;
C+3,9,"%B",S);M=161102&gt;&gt;(D+M*23/9-1-2*(M&gt;2))%7*3&amp;7;U(6,M);U(9,(M^1));
printf("%s/%s %d%d %s/%s\n",
s,s+3,D&gt;29?4:D%10&lt;6?8:3,D&gt;29?8:1070160091&gt;&gt;D%10*3&amp;7,s+6,s+9);}


(Some line breaks added for clarity)

f takes a month (1–12) and a day (1–31). Prints to stdout. Try it online!

Test cases:

2019-01-29: July/August 37 Thursday/Wednesday
2019-07-11: May/June 83 Saturday/Friday
2019-10-27: January/February 36 Friday/Saturday
2019-05-01: March/April 83 Monday/Tuesday
2019-08-24: February/January 85 /Sunday


Ungolfed

#include &lt;stdio.h&gt;
#include &lt;time.h&gt;
void f(int M, int D) {
    int month_cube[] = {6,3,0,5,2,7,4,1,4,0,5,1};
    int day_cube[] = {3,3,3,4,5,2,2,6,7,7};
    int week_cube[] = {6,1,5,2,7,4,0}; /* 1=Sun, 7=Sat, 0=none */
    int D1 = D/10, D2 = D%10;
    char s[4][99] = {{0}};
    struct tm t;

    t.tm_mon = month_cube[M-1];
    strftime(s[0], 99, "%B", &amp;t);
    t.tm_mon = month_cube[M-1]^1;
    strftime(s[1], 99, "%B", &amp;t);

    if (D1 &gt;= 3) { /* D = 30, 31 */
        D1 = 4, D2 = 8;
    } else {
        if (D2 &lt;= 5) {
            D1 = 8; /* 012[69]78: 012 -&gt; 8 */
        } else {
            D1 = 3; /* 012345: 012 -&gt; 3 */
        }
        D2 = day_cube[D2];
    }

    int W = (D + M*23/9 - 1 - 2*(M&gt;2)) % 7; /* day of week */
    if (week_cube[W]) {
        t.tm_wday = week_cube[W] - 1;
        strftime(s[2], 99, "%A", &amp;t);
    }
    if (week_cube[W]^1) {
        t.tm_wday = (week_cube[W]^1) - 1;
        strftime(s[3], 99, "%A", &amp;t);
    }

    printf("%s/%s %d%d %s/%s\n", s[0], s[1], D1, D2, s[2], s[3]);
}


Digit cubes

These are the possibilities for the digits:

Cube 1:
0 1 2 3 4 5
3 3 3 4 5 2
5

Cube 2:
0 1 2        6 7 8 9
8 8 8        2 6 7 7
6                2
9


The following mapping seems like the best choice for golfing:

   01 02 03 04 05 06 07 08 09
   83 83 84 85 82 32 36 37 37

10 11 12 13 14 15 16 17 18 19
83 83 83 84 85 82 32 36 37 37

20 21 22 23 24 25 26 27 28 29
83 83 83 84 85 82 32 36 37 37

30 31
48 48


Cheats

strftime is meant to be called with a struct tm as input. Instead, I declare int S[9] and use S[4] as tm_mon and S[6] as tm_wday. This works if the C library uses the same list of struct members as the ISO standard.

s[99] is used to store various strings from strftime, but making it an int array saves a few bytes in indexing.