#!/usr/bin/env python3
"""Télécharge les seuls fichiers officiels nécessaires au banc, révision épinglée.
Ne touche pas aux dépendances d'une application. Le dossier cible doit être neuf.
Usage : python3 preparer_exemple.py sources-symfony
"""
import hashlib, json, pathlib, sys, urllib.request
FILES = [{'path': 'Transport/Serialization/SigningSerializer.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Transport/Serialization/SigningSerializer.php', 'sha256': 'b24bbb2c2c7f3085a6ea846129e39f15d3d496b7e0a1a125e8ba8a835728c6a2'}, {'path': 'Transport/Serialization/SerializerInterface.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Transport/Serialization/SerializerInterface.php', 'sha256': 'b652655f3b4607724384bfd045b8a35bd7938f72aa8dd897a82dbf733dd8ed50'}, {'path': 'Envelope.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Envelope.php', 'sha256': '1d3d0769c0752f4885d00b0129a074887186d743bb3e9ca567b6e4ed389a65b1'}, {'path': 'Stamp/TrustStamp.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Stamp/TrustStamp.php', 'sha256': '09e786ecf912686e2a9c4e4d5bb35b9aa582351db2dd255bf85bec983e1b34c9'}, {'path': 'Stamp/StampInterface.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Stamp/StampInterface.php', 'sha256': 'f541e8868b971a0d3f04026f45b4640c34ee7adedb26374ec81f26d39869c0af'}, {'path': 'Stamp/NonSendableStampInterface.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Stamp/NonSendableStampInterface.php', 'sha256': '21dfa201364771c02d475ac6c7c792cc2dc1c902ac046dbceabb498940a5351d'}, {'path': 'Exception/InvalidArgumentException.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Exception/InvalidArgumentException.php', 'sha256': '948e55a5e492dd32a349820ca8a1754ca4af71b6dad3ad0f05e1788eb6407513'}, {'path': 'Exception/InvalidMessageSignatureException.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Exception/InvalidMessageSignatureException.php', 'sha256': 'adc159a312f51ce96b352793a03a5f6b989917012a3963216792b314535a3242'}, {'path': 'Exception/MessageDecodingFailedException.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Exception/MessageDecodingFailedException.php', 'sha256': 'eb3925a03e33fbf12b67fcbb936ab895bcb5dd76f11194830416cd298431312c'}, {'path': 'Exception/ExceptionInterface.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Exception/ExceptionInterface.php', 'sha256': '607a8381d6ad13f5fcba942eaaa0421f20c75fa169302662615830f2888c7e9c'}, {'path': 'Exception/RuntimeException.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Exception/RuntimeException.php', 'sha256': '0cf3c7683fedf1d09dc5c12cf4126602cb34dbaf1dd214f8de7a569372233836'}, {'path': 'Stamp/UnverifiedDecodingFailureStamp.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Stamp/UnverifiedDecodingFailureStamp.php', 'sha256': '49ccb2cc1c5bf332ed00f3086c7aba1411fc18b581dc0851ceddc814e0c3ddfe'}, {'path': 'Exception/UnrecoverableExceptionInterface.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Exception/UnrecoverableExceptionInterface.php', 'sha256': '79d12470e0e940abf85780f5d992756776d274361b9c2640d4795f16821e8b10'}, {'path': 'Stamp/ReceivedStamp.php', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/src/Symfony/Component/Messenger/Stamp/ReceivedStamp.php', 'sha256': 'f66b381e25f0849393f83df70b2681923c3e76c322992d852db6784315778a29'}, {'path': 'LICENSE', 'url': 'https://raw.githubusercontent.com/symfony/symfony/561f0af17ceae4fc2900ffbda8e6bbf379fe9626/LICENSE', 'sha256': '18da7e490d2aa77197a0619b25bcc771a0110132a9d76071665718d3295e73cb'}]
root = pathlib.Path(sys.argv[1])
if root.exists():
    raise SystemExit("Choisir un dossier neuf ; aucun écrasement autorisé.")
# Vérifier tous les contenus avant d'écrire le moindre fichier.
data = []
for item in FILES:
    with urllib.request.urlopen(item['url'], timeout=30) as response:
        raw = response.read()
    if hashlib.sha256(raw).hexdigest() != item['sha256']:
        raise SystemExit("Empreinte différente : " + item['path'])
    data.append((item['path'], raw))
root.mkdir(parents=True)
for name, raw in data:
    target = root / name
    target.parent.mkdir(parents=True, exist_ok=True)
    target.write_bytes(raw)
print(json.dumps({'status': 'PASS', 'files': len(data), 'source': str(root)}))
