"""DevTasks — um projeto de primeiro período, só com a biblioteca padrão."""

import json
from pathlib import Path

ARQUIVO = Path(__file__).with_name("tarefas.json")


# 1. Ler o arquivo: JSON transforma texto em listas e dicionários.
def carregar():
    if not ARQUIVO.exists():
        return []
    tarefas = json.loads(ARQUIVO.read_text(encoding="utf-8"))
    if not isinstance(tarefas, list):
        raise ValueError("O arquivo precisa conter uma lista.")
    for tarefa in tarefas:
        if not isinstance(tarefa, dict):
            raise ValueError("Cada tarefa precisa ser um dicionário.")
        if not isinstance(tarefa.get("titulo"), str) or type(tarefa.get("feita")) is not bool:
            raise ValueError("Tarefa inválida: confira titulo e feita.")
    return tarefas


# 2. Salvar: as tarefas continuam aqui depois de fechar o programa.
def salvar(tarefas):
    texto = json.dumps(tarefas, ensure_ascii=False, indent=2)
    temporario = ARQUIVO.with_suffix(".tmp")
    temporario.write_text(texto, encoding="utf-8")
    temporario.replace(ARQUIVO)


# 3. Exibir: uma repetição conta e outra desenha nossas tarefas.
def mostrar(tarefas):
    concluidas = 0
    for tarefa in tarefas:
        if tarefa["feita"]:
            concluidas += 1
    total = len(tarefas)
    percentual = int(concluidas / total * 100) if total else 0
    blocos = percentual // 5
    barra = "█" * blocos + "░" * (20 - blocos)
    print("\n" + "═" * 48)
    print("  D E V T A S K S   /   seu próximo passo")
    print("═" * 48)
    print(f"  {barra} {percentual}%")
    print(f"  {total} tarefas • {concluidas} concluídas\n")
    if not tarefas:
        print("  Seu projeto começa com uma pequena tarefa!")
    for numero, tarefa in enumerate(tarefas, start=1):
        simbolo = "✓" if tarefa["feita"] else "○"
        print(f"  {numero:02d}  {simbolo}  {tarefa['titulo']}")
    print("─" * 48)
    print("  [1] Adicionar   [2] Concluir   [0] Sair")


# 4. Entrada: strip remove espaços; um título vazio não vira tarefa.
def adicionar(tarefas):
    titulo = input("Nome da tarefa: ").strip()
    if not titulo:
        print("Digite um título com pelo menos uma letra ou número.")
        return
    tarefas.append({"titulo": titulo, "feita": False})
    salvar(tarefas)
    print("Tarefa adicionada e salva!")


# 5. Decisão: a pessoa vê posições a partir de 1; a lista começa em 0.
def concluir(tarefas):
    entrada = input("Número da tarefa: ").strip()
    try:
        numero = int(entrada)
    except ValueError:
        print("Digite um número inteiro, como 1.")
        return
    if numero < 1 or numero > len(tarefas):
        print("Essa tarefa não existe.")
        return
    tarefas[numero - 1]["feita"] = True
    salvar(tarefas)
    print("Boa! Mais um passo concluído.")


# 6. Menu: repetir até a pessoa escolher sair.
def main():
    try:
        tarefas = carregar()
    except (OSError, ValueError) as erro:
        print(f"Não foi possível ler tarefas.json: {erro}")
        print("Confira o arquivo antes de continuar. Seus dados foram preservados.")
        return
    while True:
        mostrar(tarefas)
        opcao = input("Sua escolha: ").strip()
        try:
            if opcao == "1":
                adicionar(tarefas)
            elif opcao == "2":
                concluir(tarefas)
            elif opcao == "0":
                print("Até a próxima. Continue construindo!")
                break
            else:
                print("Escolha 1, 2 ou 0.")
        except OSError as erro:
            print(f"Não foi possível salvar: {erro}")
            print("Verifique a permissão da pasta. Encerrando sem afirmar que salvou.")
            break


if __name__ == "__main__":
    try:
        main()
    except (KeyboardInterrupt, EOFError):
        print("\nAté a próxima!")
