#!/usr/bin/env python3
"""
Week 3: Comparing & Ordering Numbers
Phase 1: Number Sense & Operations
"""

import os
from weasyprint import HTML

from math_helpers import (
    CSS, TEACHER_CSS,
    page, page_multi, hdr, sec, b, bw, bl,
    tg_page, tg_page_multi, tg_sec, tg_grid_answers, tg_note, tg_section_title,
)

BASE = os.path.expanduser("~/Home_School/2nd_Grade/Math")
WEEK = os.path.join(BASE, "Week_3")


# ═══════════════════════════════════════════════════
# MONDAY — Introduction to <, >, =
# ═══════════════════════════════════════════════════
def monday():
    # 1: Learn the symbols
    s1 = '<p class="note">The alligator always eats the bigger number! The open side faces the larger number.</p>'
    s1 += '<div class="mgrid c3">'
    s1 += '<div class="abox"><p style="font-size:18px; font-weight:700;">5 <span style="font-size:24px;">&gt;</span> 2</p><p>5 is <b>greater than</b> 2</p></div>'
    s1 += '<div class="abox"><p style="font-size:18px; font-weight:700;">3 <span style="font-size:24px;">&lt;</span> 7</p><p>3 is <b>less than</b> 7</p></div>'
    s1 += '<div class="abox"><p style="font-size:18px; font-weight:700;">4 <span style="font-size:24px;">=</span> 4</p><p>4 is <b>equal to</b> 4</p></div>'
    s1 += '</div>'
    
    # 2: Practice with single digits
    s2 = '<p class="note">Fill in &lt;, &gt;, or =.</p>'
    s2 += '<div class="mgrid c3">'
    pairs = [(6, 3), (2, 9), (5, 5), (8, 1), (4, 7), (9, 9)]
    for left, right in pairs:
        s2 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
    s2 += '</div>'
    
    # 3: Compare teen numbers
    s3 = '<p class="note">Compare numbers to 20.</p>'
    s3 += '<div class="mgrid c2">'
    pairs = [(12, 15), (18, 14), (10, 10), (19, 11), (16, 17)]
    for left, right in pairs:
        s3 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
    s3 += '</div>'
    
    # 4: Compare two-digit numbers
    s4 = '<p class="note">Compare larger numbers. Look at the tens place first!</p>'
    s4 += '<div class="mgrid c2">'
    pairs = [(34, 28), (56, 65), (42, 42), (71, 69)]
    for left, right in pairs:
        s4 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
    s4 += '</div>'
    
    # 5: Draw the alligator
    s5 = '<p class="note">Draw the alligator mouth (or write =) for each pair.</p>'
    s5 += '<div class="mgrid c2">'
    pairs = [(23, 45), (67, 34), (50, 50), (89, 98)]
    for left, right in pairs:
        s5 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
    s5 += '</div>'
    
    return page(2, "Monday", "Introduction to &lt;, &gt;, =",
        f'''{sec(1, "Learn the Symbols", s1)}
{sec(2, "Single Digits", s2)}
{sec(3, "Teen Numbers", s3)}
{sec(4, "Two-Digit Numbers", s4)}
{sec(5, "Draw the Alligator", s5)}'''
    )


# ═══════════════════════════════════════════════════
# TUESDAY — Comparing & Ordering Pairs
# ═══════════════════════════════════════════════════
def tuesday():
    # 1: Review symbols
    s1 = '<p class="note">Fill in &lt;, &gt;, or =.</p>'
    s1 += '<div class="mgrid c3">'
    pairs = [(45, 38), (22, 22), (67, 76), (19, 21), (84, 79), (50, 49)]
    for left, right in pairs:
        s1 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
    s1 += '</div>'
    
    # 2: Compare using place value
    s2 = '<p class="note">Look at the tens place first. The number with more tens is greater.</p>'
    s2 += '<div class="mgrid c2">'
    s2 += '<div class="abox"><p>34 has 3 tens. 42 has 4 tens.</p><p>34 ___ 42</p></div>'
    s2 += '<div class="abox"><p>56 has 5 tens. 51 has 5 tens.</p><p>Look at ones: 6 ones ___ 1 one</p><p>56 ___ 51</p></div>'
    s2 += '<div class="abox"><p>78 has 7 tens. 69 has 6 tens.</p><p>78 ___ 69</p></div>'
    s2 += '<div class="abox"><p>43 has 4 tens. 47 has 4 tens.</p><p>Look at ones: 3 ones ___ 7 ones</p><p>43 ___ 47</p></div>'
    s2 += '</div>'
    
    # 3: Which is greater?
    s3 = '<p class="note">Circle the greater number.</p>'
    s3 += '<div class="mgrid c2">'
    pairs = [(23, 32), (45, 41), (67, 76), (88, 88)]
    for left, right in pairs:
        s3 += f'<div class="abox"><p style="font-size:16px;">{left}  or  {right}</p></div>'
    s3 += '</div>'
    
    # 4: Which is less?
    s4 = '<p class="note">Circle the lesser number.</p>'
    s4 += '<div class="mgrid c2">'
    pairs = [(56, 65), (34, 39), (72, 71), (90, 90)]
    for left, right in pairs:
        s4 += f'<div class="abox"><p style="font-size:16px;">{left}  or  {right}</p></div>'
    s4 += '</div>'
    
    # 5: True or false?
    s5 = '<p class="note">Write T for true, F for false.</p>'
    s5 += '<div class="mgrid c2">'
    statements = ["34 > 28", "45 < 42", "67 = 67", "89 > 98"]
    for stmt in statements:
        s5 += f'<div class="abox"><p style="font-size:16px;">{stmt} ___</p></div>'
    s5 += '</div>'
    
    return page(2, "Tuesday", "Comparing & Ordering Pairs",
        f'''{sec(1, "Fill in the Symbol", s1)}
{sec(2, "Use Place Value", s2)}
{sec(3, "Which is Greater?", s3)}
{sec(4, "Which is Less?", s4)}
{sec(5, "True or False?", s5)}'''
    )


# ═══════════════════════════════════════════════════
# WEDNESDAY — Ordering Numbers (Least to Greatest)
# ═══════════════════════════════════════════════════
def wednesday():
    # 1: Order 3 numbers (least to greatest)
    s1 = '<p class="note">Write the numbers from least to greatest.</p>'
    s1 += '<div class="mgrid c2">'
    sets = [[12, 18, 15], [34, 28, 31], [45, 49, 42], [23, 27, 21]]
    for nums in sets:
        s1 += f'<div class="abox"><p style="font-size:14px;">{nums[0]}, {nums[1]}, {nums[2]}</p><p>{b("5em")} , {b("5em")} , {b("5em")}</p></div>'
    s1 += '</div>'
    
    # 2: Order 3 numbers (greatest to least)
    s2 = '<p class="note">Write the numbers from greatest to least.</p>'
    s2 += '<div class="mgrid c2">'
    sets = [[23, 28, 25], [41, 47, 44], [56, 52, 59], [34, 31, 38]]
    for nums in sets:
        s2 += f'<div class="abox"><p style="font-size:14px;">{nums[0]}, {nums[1]}, {nums[2]}</p><p>{b("5em")} , {b("5em")} , {b("5em")}</p></div>'
    s2 += '</div>'
    
    # 3: Order 4 numbers (least to greatest)
    s3 = '<p class="note">Write from least to greatest.</p>'
    s3 += '<div class="mgrid c2">'
    sets = [[12, 19, 15, 17], [34, 31, 38, 36]]
    for nums in sets:
        s3 += f'<div class="abox"><p style="font-size:14px;">{", ".join(map(str, nums))}</p><p>{", ".join([b("5em")] * 4)}</p></div>'
    s3 += '</div>'
    
    # 4: Order 4 numbers (greatest to least)
    s4 = '<p class="note">Write from greatest to least.</p>'
    s4 += '<div class="mgrid c2">'
    sets = [[45, 42, 48, 41], [23, 29, 26, 21]]
    for nums in sets:
        s4 += f'<div class="abox"><p style="font-size:14px;">{", ".join(map(str, nums))}</p><p>{", ".join([b("5em")] * 4)}</p></div>'
    s4 += '</div>'
    
    # 5: Order 5 numbers (challenge)
    s5 = '<p class="note">Challenge: Order from least to greatest.</p>'
    s5 += '<div class="mgrid c2">'
    sets = [[12, 18, 15, 11, 19], [34, 31, 38, 36, 33]]
    for nums in sets:
        s5 += f'<div class="abox"><p style="font-size:14px;">{", ".join(map(str, nums))}</p><p>{", ".join([b("5em")] * 5)}</p></div>'
    s5 += '</div>'
    
    return page(2, "Wednesday", "Ordering Numbers",
        f'''{sec(1, "Least to Greatest (3)", s1)}
{sec(2, "Greatest to Least (3)", s2)}
{sec(3, "Least to Greatest (4)", s3)}
{sec(4, "Greatest to Least (4)", s4)}
{sec(5, "Challenge (5 numbers)", s5)}'''
    )


# ═══════════════════════════════════════════════════
# THURSDAY — Real Life Comparing
# ═══════════════════════════════════════════════════
def thursday():
    # 1: Word problems - comparing
    s1 = '<div class="wp">'
    s1 += '<p>Sarah has 23 stickers. Tom has 31 stickers. Who has more? ' + b('6em') + '</p>'
    s1 += '<p>Lily read 45 pages. Jake read 42 pages. Who read more? ' + b('6em') + '</p>'
    s1 += '<p>Maya has 18 blocks. Sam has 28 blocks. Who has fewer? ' + b('6em') + '</p>'
    s1 += '</div>'
    
    # 2: Compare collections
    s2 = '<p class="note">Fill in &lt;, &gt;, or =.</p>'
    s2 += '<div class="mgrid c2">'
    s2 += '<div class="abox"><p>Class A has 24 students. Class B has 27 students.</p><p>24 ___ 27</p></div>'
    s2 += '<div class="abox"><p>Box A has 56 apples. Box B has 48 apples.</p><p>56 ___ 48</p></div>'
    s2 += '<div class="abox"><p>Store A sells for $35. Store B sells for $42.</p><p>35 ___ 42</p></div>'
    s2 += '<div class="abox"><p>Team A scored 67 points. Team B scored 67 points.</p><p>67 ___ 67</p></div>'
    s2 += '</div>'
    
    # 3: Height comparison
    s3 = '<p class="note">Compare heights in inches.</p>'
    s3 += '<div class="mgrid c2">'
    s3 += '<div class="abox"><p>Tom is 42 inches tall. Sarah is 45 inches tall.</p><p>Who is taller? ' + b('6em') + '</p></div>'
    s3 += '<div class="abox"><p>Maya is 38 inches tall. Jake is 40 inches tall.</p><p>Who is shorter? ' + b('6em') + '</p></div>'
    s3 += '</div>'
    
    # 4: Distance comparison
    s4 = '<p class="note">Compare distances in meters.</p>'
    s4 += '<div class="mgrid c2">'
    s4 += '<div class="abox"><p>School is 125 meters from home. Park is 98 meters from home.</p><p>Which is farther? ' + b('6em') + '</p></div>'
    s4 += '<div class="abox"><p>Store A is 67 meters away. Store B is 76 meters away.</p><p>Which is closer? ' + b('6em') + '</p></div>'
    s4 += '</div>'
    
    # 5: Age comparison
    s5 = '<div class="starbox"><p><b>Age Comparison</b></p>'
    s5 += '<p>Grandma is 65 years old. Grandpa is 68 years old. Who is older? ' + b('6em') + '</p>'
    s5 += '<p>Mom is 42 years old. Dad is 45 years old. Who is younger? ' + b('6em') + '</p></div>'
    
    return page(2, "Thursday", "Real Life Comparing",
        f'''{sec(1, "Word Problems", s1)}
{sec(2, "Compare Collections", s2)}
{sec(3, "Height Comparison", s3)}
{sec(4, "Distance Comparison", s4)}
{sec(5, "Age Comparison", s5)}'''
    )


# ═══════════════════════════════════════════════════
# FRIDAY — Week 3 Review & Challenge
# ═══════════════════════════════════════════════════
def friday():
    # 1: Quick symbol review
    s1 = '<p class="note">Fill in &lt;, &gt;, or =.</p>'
    s1 += '<div class="mgrid c3">'
    pairs = [(34, 43), (56, 56), (78, 67), (29, 31), (45, 42), (90, 89)]
    for left, right in pairs:
        s1 += f'<div class="abox"><p style="font-size:16px;">{left} ___ {right}</p></div>'
    s1 += '</div>'
    
    # 2: Order least to greatest
    s2 = '<p class="note">Order from least to greatest.</p>'
    s2 += '<div class="mgrid c2">'
    sets = [[23, 28, 21], [45, 42, 48], [34, 39, 36]]
    for nums in sets:
        s2 += f'<div class="abox"><p style="font-size:14px;">{", ".join(map(str, nums))}</p><p>{", ".join([b("5em")] * 3)}</p></div>'
    s2 += '</div>'
    
    # 3: Order greatest to least
    s3 = '<p class="note">Order from greatest to least.</p>'
    s3 += '<div class="mgrid c2">'
    sets = [[56, 52, 59], [34, 31, 38], [67, 62, 65]]
    for nums in sets:
        s3 += f'<div class="abox"><p style="font-size:14px;">{", ".join(map(str, nums))}</p><p>{", ".join([b("5em")] * 3)}</p></div>'
    s3 += '</div>'
    
    # 4: True or false review
    s4 = '<p class="note">Write T for true, F for false.</p>'
    s4 += '<div class="mgrid c2">'
    statements = ["56 > 65", "34 < 43", "78 = 78", "29 > 31"]
    for stmt in statements:
        s4 += f'<div class="abox"><p style="font-size:16px;">{stmt} ___</p></div>'
    s4 += '</div>'
    
    # 5: Challenge word problems
    s5 = '<div class="wp">'
    s5 += '<p>Emma has 34 stickers. Jake has 28 stickers. Lily has 42 stickers. Order their names from least to greatest stickers.</p>'
    s5 += '<p>' + b('6em') + ', ' + b('6em') + ', ' + b('6em') + '</p>'
    s5 += '<p>Tom ran 156 meters. Sam ran 165 meters. Mike ran 159 meters. Who ran the farthest? ' + b('6em') + '</p>'
    s5 += '</div>'
    
    return page(2, "Friday", "Week 3 Review & Challenge",
        f'''{sec(1, "Symbol Review", s1)}
{sec(2, "Least to Greatest", s2)}
{sec(3, "Greatest to Least", s3)}
{sec(4, "True or False", s4)}
{sec(5, "Challenge Problems", s5)}'''
    )


# ═══════════════════════════════════════════════════
# COMBINED TEACHER GUIDE
# ═══════════════════════════════════════════════════

def teacher_guide():
    """Generate combined teacher guide for all 5 days."""
    return tg_page_multi(
        "Week 3", "Comparing & Ordering Numbers — Teacher Guide",
        
        # Monday
        tg_section_title("Monday: Introduction to <, >, =") +
        tg_sec(1, "Learn Symbols", ["5>2", "3<7", "4=4"]) +
        tg_sec(2, "Single Digits", [">", "<", "=", ">", "<", "="]) +
        tg_sec(3, "Teen Numbers", ["<", ">", "=", ">", "<"]) +
        tg_sec(4, "Two-Digit Numbers", [">", "<", "=", ">"]) +
        tg_sec(5, "Draw Alligator", ["<", ">", "=", "<"]) +
        tg_note("Page break"),
        
        # Tuesday
        tg_section_title("Tuesday: Comparing & Ordering Pairs") +
        tg_sec(1, "Fill in Symbol", [">", "=", "<", ">", ">", ">"]) +
        tg_sec(2, "Use Place Value", ["<", ">", ">"]) +
        tg_sec(3, "Which Greater", ["32", "45", "76", "88 (equal)"]) +
        tg_sec(4, "Which Less", ["56", "34", "71", "90 (equal)"]) +
        tg_sec(5, "True or False", ["T", "F", "T", "F"]) +
        tg_note("Page break"),
        
        # Wednesday
        tg_section_title("Wednesday: Ordering Numbers") +
        tg_sec(1, "Least to Greatest (3)", ["12,15,18", "28,31,34", "42,45,49", "21,23,27"]) +
        tg_sec(2, "Greatest to Least (3)", ["28,25,23", "47,44,41", "59,56,52", "38,34,31"]) +
        tg_sec(3, "Least to Greatest (4)", ["12,15,17,19", "31,34,36,38"]) +
        tg_sec(4, "Greatest to Least (4)", ["48,45,42,41", "29,26,23,21"]) +
        tg_sec(5, "Challenge (5)", ["11,12,15,18,19", "31,33,34,36,38"]) +
        tg_note("Page break"),
        
        # Thursday
        tg_section_title("Thursday: Real Life Comparing") +
        tg_sec(1, "Word Problems", ["Tom", "Lily", "Maya"]) +
        tg_sec(2, "Compare Collections", ["<", ">", "<", "="]) +
        tg_sec(3, "Height Comparison", ["Sarah", "Maya"]) +
        tg_sec(4, "Distance Comparison", ["School", "Store A"]) +
        tg_sec(5, "Age Comparison", ["Grandpa", "Mom"]) +
        tg_note("Page break"),
        
        # Friday
        tg_section_title("Friday: Week 3 Review & Challenge") +
        tg_sec(1, "Symbol Review", ["<", "=", ">", "<", ">", ">"]) +
        tg_sec(2, "Least to Greatest", ["21,23,28", "42,45,48", "34,36,39"]) +
        tg_sec(3, "Greatest to Least", ["59,56,52", "38,34,31", "67,65,62"]) +
        tg_sec(4, "True or False", ["F", "T", "T", "F"]) +
        tg_sec(5, "Challenge", ["Jake, Emma, Lily", "Sam"])
    )


# ═══════════════════════════════════════════════════
# GENERATE
# ═══════════════════════════════════════════════════

if __name__ == "__main__":
    # Generate all days at once
    days = [
        (monday, "Monday", "Introduction to <, >, ="),
        (tuesday, "Tuesday", "Comparing & Ordering Pairs"),
        (wednesday, "Wednesday", "Ordering Numbers"),
        (thursday, "Thursday", "Real Life Comparing"),
        (friday, "Friday", "Week 3 Review & Challenge"),
    ]
    
    # Generate student worksheets
    for lesson_func, day, title in days:
        html = lesson_func()
        fname = f"Week_3_{day}"
        path = os.path.join(WEEK, f"{fname}.html")
        with open(path, "w") as f:
            f.write(html)
        pdf_path = os.path.join(WEEK, f"{fname}.pdf")
        HTML(filename=path).write_pdf(pdf_path)
        print(f"Generated: {pdf_path}")
    
    # Generate combined teacher guide
    html = teacher_guide()
    path = os.path.join(WEEK, "Week_3_Teacher_Guide.html")
    with open(path, "w") as f:
        f.write(html)
    pdf_path = os.path.join(WEEK, "Week_3_Teacher_Guide.pdf")
    HTML(filename=path).write_pdf(pdf_path)
    print(f"Generated: {pdf_path}")
    
    print("Week 3 complete!")