#!/usr/bin/env python3
"""Produce an encoded sheet and independent expected output; Python 3.9+."""
import argparse
from pathlib import Path

SPECIAL = dict(zip('ABMOP', ['🅰', '🅱', 'Ⓜ', '🅾', '🅿']))
NAMES = ['ANTONIOCUNHA', 'DIOGOBARBOSA', 'DIOGO CORDEIRO', 'FABIO SILVA',
         'GABRIELSARAIVA', 'HUGOSALES', 'JOAONEVES', 'JOAOVARELAS',
         'JOAOCORREIA', 'JOAODIAS', 'JOAOSANTIAGO', 'JOAORIBEIRO', 'JOAOBENTO',
         'NUNOTAVEIRA', 'PAULOSOUSA', 'PEDROMOTA', 'PEDROCOSTA',
         'PEDROFERREIRINHA', 'PEDROFERNANDES', 'TIAGOMELO']

class Random:
    def __init__(self, seed): self.state = seed & 0xffffffff
    def take(self, n):
        self.state = (1664525 * self.state + 1013904223) & 0xffffffff
        return self.state % n

def expected(rows):
    width = max(4, *(len(name) for name, _ in rows))
    return f"{'NOME':<{width}}  NOTA\n" + ''.join(f'{name:<{width}}  {grade}\n' for name, grade in rows) + 'Cumprimentos algorítmicos!\n'

def encode(text, rng):
    result = []
    for ch in text:
        mode = rng.take(4)
        if ch == ' ' or mode == 0: result.append(ch)
        elif ch.isdigit(): result.append(ch + ('\ufe0f' if mode == 2 else '') + '\u20e3')
        elif ch in SPECIAL and mode != 1: result.append(SPECIAL[ch] + ('\ufe0f' if mode == 2 else ''))
        else: result.append(chr(0x1f1e6 + ord(ch) - ord('A')))
    return ''.join(result)

def sheet(rows, seed=42):
    rng = Random(seed)
    return '\n'.join(encode(name + ' ' * (2 + rng.take(31)) + str(grade), rng) + ' ' * rng.take(17)
                     for name, grade in [('NOME', 'NOTA'), *rows]) + '\n'

if __name__ == '__main__':
    p = argparse.ArgumentParser(description=__doc__)
    p.add_argument('--seed', type=int, default=42)
    p.add_argument('--count', type=int, default=20)
    p.add_argument('--output', type=Path, default=Path('generated'))
    p.add_argument('--varied', action='store_true', help='include grades 0–20 and an 80-letter name')
    args = p.parse_args()
    if not 1 <= args.count <= 10000: p.error('--count must be 1–10000')
    rows = [(NAMES[i % len(NAMES)], i % 21 if args.varied else 20) for i in range(args.count)]
    if args.varied: rows[0] = ('A' * 80, 0)
    args.output.mkdir(parents=True, exist_ok=True)
    (args.output / 'input.txt').write_text(sheet(rows, args.seed), encoding='utf-8')
    (args.output / 'output.txt').write_text(expected(rows), encoding='utf-8')
