# ==============================================================================
"""PRIME : compute all prime numbers from 2 to n"""
# ==============================================================================
__author__  = "Christophe Schlick modified by Philippe Blasi"
__version__ = "1.0" # test division with each previously found prime number
__date__    = "2022-11-12"
__usage__   = """
User input : <n> (where n:int > 1)
App output : sequence of prime numbers from 2 to n""" 
# ==============================================================================
from ezCLI import convert, grid, write_csv
# ------------------------------------------------------------------------------
def wrap(items:list, n=15) -> list:
  """convert 1D list to 2D list by wrapping every 'n' items"""
  return [items[k:k+n] for k in range(0, len(items), n)]
# ------------------------------------------------------------------------------
def prime(n:int) -> list:
  """compute all prime numbers from 2 to n"""
  primes = [2]
  for p in range(3, n+1, 2): # loop over all odd numbers from 3 to 'n'
    for q in primes: # loop over all prime numbers already stored in 'primes'
      if p%q == 0: break # 'p' is not prime, so break loop and try next number
      if q*q > p: primes.append(p); break # 'p' is prime, so append to 'primes'
  return primes # return final list with all prime numbers up to 'n'
# ------------------------------------------------------------------------------
def main():
  """manage user interaction loop"""
  print(f"{'-'*80}\n{__doc__}{__usage__}\n{'-'*80}") # show info (doc and usage)
  while True: # user interaction loop 
    command = input("Enter value for <n> : ") # wait for user input
    if command == '': break # break interaction loop if user input is empty
    n = convert(command) # analyze user input and convert to appropriate type
    assert type(n) is int and n > 1, "<n> must be an integer and greater than 1"
    # --------------------------------------------------------------------------
    primes = prime(n) # compute list of prime numbers up to 'n'
    print(grid(wrap(primes))) # show prime numbers in a grid with auto-wrapping
    # --------------------------------------------------------------------------
    write_csv('primes.csv', primes) # write list on disk as CSV file
  print('See you later...')
# ==============================================================================
if __name__ == "__main__":
  main()
# ==============================================================================
