# MK'n'DIR
# V007 20030304 Aggiunto contatori e opzione la modalità velocissima: + seguito da Invio per accettare tutti i valori predefiniti.
# V006 20230220 - 20230218 Parametrizzato prefisso, separatore, numeratore progressivo, aggiunto parametro numero cifre, aggiunto controllo esistenza cartella e altri controlli.
# Invertito ordine input prefisso, separatore, numero cartelle, progressivo iniziale e numero cifre per poter predisporre ulteriori controlli (numero cartelle + progressivo iniziale consente di verificare il numero di cifre minimo)
# V005 20230106
# V004 20230106
# V003 20230101
# V002 20221217
# V001 20221216

import os
from datetime import datetime
import sys

print("\033[92m")
print("MK'n'DIR - V. 007")
print("")
print("Stiamo per creare un certo numero di cartelle in \033[0m" + os.path.dirname(os.path.realpath(__file__)) +"\\\033[92m per proseguire servono pochi dati... \nIn ogni momento Ctrl+c interromperà l'esecuzione.")
print("")
print("Le cartelle potranno avere un nome composto di tre parti distinte: \033[0mprefisso\033[92m, \033[0mseparatore\033[92m e \033[0mprogressivo numerico\033[92m (per esempio Cartella_001, Cartella_002, ecc.).")
print("\nNel mio caso, per il prefisso, è comodo utilizzare la data nel formato AAAAMMGG (anno, mese, giorno) per cui questo è il formato predefinito.")
print("\nTra poco sarà possibile specificare: il prefisso, il separatore, da quale numero deve iniziare il progressivo numerico, di quante cifre si deve comporre il progressivo numerico e naturalmente quante cartelle creare. Per velocizzare sarà possibile accettare i dati via via proposti.")
print("")

selezione_veloce=0
adessodata=datetime.now()
### dati predefiniti
prefisso_proposto=adessodata.strftime("%Y%m%d")
separatore_proposto="_"
numero_cartelle_proposto=10
progressivo_iniziale_proposto=1
numero_cifre_proposto=3

### prefisso
print("")
prefisso=input("Inserire il prefisso desiderato seguito da Invio,\noppure Invio per accettare \033[0m"+str(prefisso_proposto)+"\033[92m,\noppure ? seguito da Invio per informazioni su MK'n'DIR,\noppure x seguito da Invio per omettere il prefisso,\noppure + seguito da Invio per accettare tutti i valori predefiniti (modalità velocissima): ")
if not prefisso:
    prefisso=prefisso_proposto

if prefisso=='x':
    prefisso=""
    
if prefisso=='?':
    print("\n\n\033[93m--- Informazioni ---\033[92m")
    print("\nMK'n'DIR (make n directory) non fa altro che creare, nella cartella in cui si trova, un numero definito di cartelle con il nome formato da un prefisso e da un separatore uguali per tutte e da un progressivo numerico di cui si potrà definire sia il numero iniziale sia il numero di cifre che lo compongono. Il numero iniziale generalmente è pari a 1 ma può essere comodo poterlo impostare nel caso fosse necessario creare ulteriori cartelle appartenenti allo stesso gruppo.")
    print("\nSono richiesti pochi dati, o nella migliore situazione solo pochi invii per confermare i parametri proposti, addirittura solo un + ed un Invio se si sceglie di usare la modalità velocissima!")
    print("\n1 - Il nome delle cartelle è a discrezione dell'utente, il valore predefinito è la data odierna nel formato AAAAMMGG.")
    print("\n2 - Il separatore, serve a separare in nome dal numeratore, solitamente è sufficiente un carattere, ma nulla vieta di impostare separatori più lunghi, il valore predefinito è _ (il carattere underscore).")
    print("\n3 - Il numero di cartelle che si intende creare, il valore predefinito è 10.")
    print("\n4 - Il numeratore progressivo da cui iniziare a numerare le nuove cartelle, il valore predefinito è 1.")
    print("\n5 - Il numero di cifre che formano il numeratore, il valore predefinito è 3, per cui 1, 10 e 110 saranno rappresentati con 001, 010 e 110.")
    continuare=input("\n\n   Premere Invio per continuare.")
    print("\n\n\033[93m--- Limiti superati ---\033[92m")
    print("\nMk'n'DIR evita di creare le cartelle già presenti.")
    print("\nL'escamotage di indicare con x l'assenza del prefisso e/o del separatore non pregiudica la possibilità di creare cartelle con nomi del tipo: xx001, xx002 e così via, per ottenere questi nomi sarà sufficiente inserire xx nel prefisso e x nel separatore oppure viceversa.")
    print("\nAl momento sono presenti solo alcuni controlli di coerenza dei dati immessi!")
    print("\nil numeratore iniziale, il numero di cifre che lo compondono e il numero delle cartelle da creare devono essere numeri!!!")
    print("\nInserito controllo, per cui il numeratore progressivo deve avere un numero di cifre almeno pari a quello della somma del numeratore iniziale più le cartelle da creare.")
    print("\n\n\033[93m--- Attuali limiti ---\033[92m")
    print("\nMK'n'DIR è stato provato con Python 3.9.7 in un pc con Windows 11. Non si sa cosa possa succedere con altri sistemi o versioni!!!")
    print("\n\n\033[93m--- Garanzie ---\033[92m")
    print("\nNon vi è alcuna garanzia sul funzionamento corretto o imprevisto e sugli eventuali danni che ne possono derivare.")
    continuare=input("\n\n   Premere Invio per continuare.")
    print("\n\n\033[93m--- La storia ---\033[92m")
    print("\nMi ero accorto che stavo facendo un lavoro ripetitivo quando, per diversi giorni, mi ero trovato a creare una nuova cartella, a darle il nome del giorno nel formato AAAAMMGG, seguito da un '_001', a fare un Ctrl+c seguito da diversi Ctrl+v e poi ad aggiustare i nomi in maniera da ottenere AAAAMMGG_002, AAAAMMGG_003 e così via.")
    print("Nei primi giorni si trattava di creare al massimo sette otto cartelle, negli ultimi avevo superato le trenta!")
    print("\nIniziai a pensare ad una piccola procedura batch, poi pensai di aggiungerci dei parametri e, per facilitarmi il compito, decisi che era l'occasione giusta per provare a scrivere il mio primo programma in Python!")
    print("D'accoroo, non che come programma sia favoloso... ma, tenuto conto che si tratta del mio primo programma in Python, vederlo funzionare nel giro di un paio d'ore è stata una bella soddisfazione...")
    print("Per realizzare un \"prodotto\" fruibile anche da altri con spiegazioni e un minimo di gestione degli errori il paio d'ore è stato abbondantemente superato!")
    print("\n\n\033[93m--- Ultima versione ---\033[92m")
    print("\nUna versione aggiornata di MK'n'DIR si trova sul sito www.gremmo.it e lì si trovano anche i riferimenti per segnalare eventuali errori o malfunzionamenti!")
    finito=input("\n\n   Premere Invio per chiudere.")
    sys.exit()

if prefisso=='+':
    prefisso=prefisso_proposto
    selezione_veloce=1

if selezione_veloce==0:
    ### separatore
    print("")
    separatore=input("Inserire il separatore desiderato seguito da Invio,\noppure Invio per accettare \033[0m"+str(separatore_proposto)+"\033[92m,\noppure x seguito da Invio per omettere il separatore: ")
    if not separatore:
        separatore=separatore_proposto

    if separatore=='x':
        separatore=""

    ### numero cartelle
    ck=0
    while ck==0:
        numero_cartelle_proposto=10
        print("")
        numero_cartelle=input("Inserire il numero di cartelle da creare desiderato seguito da Invio,\noppure Invio per accettare \033[0m"+str(numero_cartelle_proposto)+"\033[92m: ")

        if not numero_cartelle:
            numero_cartelle=numero_cartelle_proposto
            numero_cartelle=str(numero_cartelle)
        if (numero_cartelle.isnumeric()):
            numero_cartelle=int(numero_cartelle)
            # Il numero di cartelle è un numero.
            ck=1
            break
        else:
            print("\033[91mIl numero di cartelle non è un numero male!\033[92m")

    ### progressivo iniziale
    ck=0
    while ck==0:
        print("")
        progressivo_iniziale=input("Inserire il primo numero progressivo desiderato seguito da Invio,\noppure Invio per accettare \033[0m"+str(progressivo_iniziale_proposto)+"\033[92m: ")
        if not progressivo_iniziale:
            progressivo_iniziale=progressivo_iniziale_proposto
            progressivo_iniziale=str(progressivo_iniziale)
        if (progressivo_iniziale.isnumeric()):
            progressivo_iniziale=int(progressivo_iniziale)
            # Il progressivo iniziale è un numero.
            ck=1
            break
        else:
            print("\033[91mIl progressivo iniziale deve essere un numero!\033[92m")

    ### numero cifre
    numero_cifre_minimo=len(str(numero_cartelle+progressivo_iniziale))
    if numero_cifre_minimo>numero_cifre_proposto:
        numero_cifre_proposto=numero_cifre_minimo

    ck=0
    while ck==0:
        print("")
        numero_cifre=input("Inserire il numero di cifre che compongono il numeratore seguito da Invio (in base ai dati appena digitati occorrono almeno "+str(numero_cifre_minimo)+ " cifre),\noppure Invio per accettarne \033[0m"+str(numero_cifre_proposto)+"\033[92m: ")
        if not numero_cifre:
            numero_cifre=numero_cifre_proposto
            numero_cifre=str(numero_cifre) 
        if (numero_cifre.isnumeric()):
            numero_cifre=int(numero_cifre)
            # Il numero di cifre è un numero.
            ck=1
            if int(numero_cifre)<int(numero_cifre_minimo):
                ck=0
                print("\033[91mIl numero di cifre deve essere maggiore!\033[92m")
        else:
            print("\033[91mIl numero di cifre deve essere un numero!\033[92m")

else:
    # modalità velocissima si saltano alcuni invii tuttavia si saltano anche i controlli di coerenza dei dati!
    prefisso=prefisso_proposto
    separatore=separatore_proposto
    numero_cartelle=numero_cartelle_proposto
    progressivo_iniziale=progressivo_iniziale_proposto
    numero_cifre=numero_cifre_proposto


print("")
print("-----------------------------")
print("\033[92mprefisso             \033[0m"+str(prefisso))
print("\033[92mseparatore           \033[0m"+str(separatore))
print("\033[92mnumero_cartelle      \033[0m"+str(numero_cartelle))
print("\033[92mprogressivo_iniziale \033[0m"+str(progressivo_iniziale))
print("\033[92mnumero_cifre         \033[0m"+str(numero_cifre))
print("\033[92m-----------------------------")
print("")


cartelle = range(numero_cartelle)
numero_cartelle_create=0
numero_cartelle_saltate=0
for cartella in cartelle:
    cart=str(cartella+progressivo_iniziale)

    file=prefisso+separatore+cart.rjust(numero_cifre,"0")

    ck_direxist=os.path.isdir(os.path.dirname(os.path.realpath(__file__))+"\\"+file)

    if ck_direxist is True:
        print("\033[92mLa cartella \033[0m"+prefisso+separatore+cart.rjust(numero_cifre,"0"), "\033[92mesiste già.")
        numero_cartelle_saltate+=1
    else:
        os.mkdir(prefisso+separatore+cart.rjust(numero_cifre,"0"))
        print("\033[092mLa cartella \033[0m"+prefisso+separatore+cart.rjust(numero_cifre,"0"), "\033[92mè stata appena creata.")
        numero_cartelle_create+=1
print("")

# crea la stringa di riepilogo cartelle create e cartelle saltate
resoconto=""

if numero_cartelle_create>0:
    resoconto=resoconto+"Abbiamo creato "+str(numero_cartelle_create)+" "
    if numero_cartelle_create==1:
        resoconto=resoconto+"cartella"
    else:
        resoconto=resoconto+"cartelle"
else:
    resoconto="Non abbiamo creato cartelle"

if numero_cartelle_saltate>0:
    if numero_cartelle_saltate==1:
        resoconto=resoconto+", "+str(numero_cartelle_saltate)+" cartella probabilmente era già esistente nella cartella "+ os.path.dirname(os.path.realpath(__file__)+".")
    else:
        resoconto=resoconto+", "+str(numero_cartelle_saltate)+" cartelle probabilmente erano già esistenti nella cartella "+ os.path.dirname(os.path.realpath(__file__)+".")
else:
    resoconto=resoconto+", tutte quelle richieste, nella cartella "+ os.path.dirname(os.path.realpath(__file__)+".")

print(resoconto)

print("")
finito=input("Finito! (Premere Invio per chiudere)")
