#!/usr/bin/env python3
"""Cria a pasta de um dossiê de módulo a partir do `_template/`.

Fase 3 do protocolo. Garante que a pasta nasca com os 9 arquivos canônicos,
cada um já com o esqueleto e os marcadores do módulo preenchidos — de modo que
o agente preencha, em vez de inventar a estrutura.

Uso:
  python3 dossie_modules/_tools/scaffold.py --projeto <id> --slug <slug> --titulo "<Titulo>"
  python3 dossie_modules/_tools/scaffold.py --projeto <id> --slug <slug> --sobrescrever
"""
import argparse
import os
import re
import shutil
import sys

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import _cfg  # noqa: E402

PLACEHOLDERS = {
    '<slug-do-modulos>': 'SLUG',
    '<slug-do-modulo>': 'SLUG',
    '<NOME DO MÓDULO>': 'TITULO',
}


def preencher(texto, slug, titulo, natureza, versoes, estado='a definir'):
    """Substitui marcadores do template por dados do módulo."""
    texto = texto.replace('<NOME DO MÓDULO>', titulo)
    texto = texto.replace('<slug-do-modulos>', slug)
    texto = texto.replace('<slug-do-modulo>', slug)
    texto = texto.replace('<Titulo>', titulo)
    texto = texto.replace('<NATUREZA>', natureza)
    texto = texto.replace('<VERSAO>', versoes)
    texto = texto.replace('<ESTADO>', estado)
    return texto


def main():
    ap = argparse.ArgumentParser(description=__doc__,
                                 formatter_class=argparse.RawDescriptionHelpFormatter)
    _cfg.cli_projeto(ap)
    ap.add_argument('--slug', required=True, help='slug do módulo (kebab-case)')
    ap.add_argument('--titulo', required=True, help='nome de exibição do módulo')
    ap.add_argument('--natureza', default='CMS (painel administrativo) | Portal (público) | Ambos')
    ap.add_argument('--versoes', default='a definir')
    ap.add_argument('--estado', default='a definir',
                    help='estado do modulo: OK | apenas v5 | migrado v5 -> v6 | novo na v6')
    ap.add_argument('--template', default=None, help='pasta de template alternativa')
    ap.add_argument('--sobrescrever', action='store_true',
                    help='apaga a pasta existente antes de recriar')
    args = ap.parse_args()

    cfg = _cfg.load(args.projeto, args.raiz)
    dos = cfg['dos_dir']
    template = args.template or os.path.join(
        os.path.dirname(os.path.abspath(__file__)), '..', '_template')
    template = os.path.abspath(template)

    if not os.path.isdir(template):
        raise SystemExit(f'template nao encontrado: {template}')

    destino = os.path.join(dos, args.slug)
    if os.path.exists(destino):
        if not args.sobrescrever:
            raise SystemExit(
                f"'{args.slug}' ja existe em {dos}. Use --sobrescrever para recriar.")
        shutil.rmtree(destino)
    os.makedirs(destino, exist_ok=True)

    canonicos = cfg['arquivos_canonicos']
    criados, ignorados = [], []
    for nome in canonicos:
        origem = os.path.join(template, nome)
        if not os.path.exists(origem):
            ignorados.append(nome)
            continue
        txt = open(origem, encoding='utf-8').read()
        txt = preencher(txt, args.slug, args.titulo, args.natureza,
                        args.versoes, args.estado)
        with open(os.path.join(destino, nome), 'w', encoding='utf-8') as fh:
            fh.write(txt)
        criados.append(nome)

    # O contrato NAO e copiado para dentro da pasta: ele contem literais
    # como `<NOME>` (que o auditor trataria como placeholder) e seria
    # duplicado 66 vezes. O agente o le no caminho canonico.

    print(f'pasta criada: {destino}')
    print(f'  {len(criados)} arquivos: {", ".join(criados)}')
    if ignorados:
        print(f'  SEM TEMPLATE (criar manualmente): {", ".join(ignorados)}')
    faltam = [c for c in canonicos if c not in criados]
    if faltam:
        print(f'  ATENCAO: faltam templates para {faltam}')
    return 0


if __name__ == '__main__':
    sys.exit(main())
