# Parcours complet de souscription, du devis aux documents (Python 3.8+).
# Utilise le client coveraf.py (même dossier). En sandbox :
#   COVERAF_CLE_API=cvr_test_... COVERAF_SECRET=cvr_sig_... python parcours-complet.py
import os
import time
import urllib.request
import uuid

from coveraf import BASE_URL, appel_coveraf


def telecharger(chemin, fichier):
    requete = urllib.request.Request(BASE_URL + chemin, headers={"Authorization": f"Bearer {os.environ['COVERAF_CLE_API']}"})
    with urllib.request.urlopen(requete) as reponse, open(fichier, "wb") as f:
        f.write(reponse.read())
    print("  enregistré :", fichier)


# 1. Devis : le prix est calculé par l'API.
devis = appel_coveraf("POST", "/v1/devis", {
    "offre": "securvie_500k",
    "donnees": {"assure": {"date_naissance": "1985-06-15"}},
    "reference_partenaire": "CMD-2026-0042",
})
print(f"1. Devis {devis['id']} : {devis['prime']['totale']} FCFA, valable jusqu'au {devis['expire_le']}")

# 2. Conditions Générales, à présenter au client AVANT le paiement.
print("2. Conditions Générales")
telecharger(f"/v1/produits/{devis['offre']}/conditions-generales", "conditions-generales.pdf")

# 3. Souscription : la demande du client. Aucun contrat n'existe encore.
souscription = appel_coveraf("POST", "/v1/souscriptions", {
    "devis_id": devis["id"],
    "souscripteur": {"nom": "KONE", "prenom": "Awa", "telephone": "+2250701020304", "email": "awa.kone@example.com"},
    "informations": {"profession": "Commerçante", "beneficiaires": [{"nom": "KONE Moussa", "lien": "Conjoint", "part": 100}]},
}, idempotency_key=str(uuid.uuid4()))
montant = souscription["montant_a_payer"]["montant"]
print(f"3. Souscription {souscription['id']} : {montant} FCFA à payer ({souscription['mode_paiement']})")

# 4. Paiement, selon le mode du compte.
numero = None
if souscription["mode_paiement"] == "encaissement_partenaire":
    # Mode A : vous avez encaissé le client, vous le déclarez.
    payee = appel_coveraf("POST", f"/v1/souscriptions/{souscription['id']}/confirmer-paiement", {
        "reference_transaction": f"OM-{int(time.time() * 1000)}",
        "operateur": "orange",
        "montant": montant,
    }, idempotency_key=str(uuid.uuid4()))
    numero = payee["contrat"]["numero"]
else:
    # Mode B : COVERAF encaisse en Mobile Money. En sandbox, 0700000001 réussit.
    en_cours = appel_coveraf("POST", f"/v1/souscriptions/{souscription['id']}/paiement", {
        "operateur": "orange",
        "telephone_payeur": "0700000001",
    }, idempotency_key=str(uuid.uuid4()))
    print(f"   paiement {en_cours['paiement']['id']} en attente, le client valide sur son téléphone")
    # Sans notifications : consultation toutes les 5 secondes, 3 minutes au plus.
    for _ in range(36):
        time.sleep(5)
        etat = appel_coveraf("GET", f"/v1/souscriptions/{souscription['id']}")
        if etat["paiement"] and etat["paiement"]["statut"] == "echoue":
            raise RuntimeError(f"Paiement échoué : {etat['paiement']['motif_echec']}")
        if etat["contrat"]:
            numero = etat["contrat"]["numero"]
            break
    if not numero:
        raise RuntimeError("Paiement toujours en attente : réessayez plus tard.")
print(f"4. Paiement confirmé, contrat {numero} émis")

# 5. Contrat et documents.
contrat = appel_coveraf("GET", f"/v1/contrats/{numero}")
print(f"5. Contrat {contrat['statut']}, du {contrat['date_effet']} au {contrat['date_echeance']}")
for document in contrat["documents"]:
    if document["disponible"]:
        telecharger(document["adresse"], f"{document['type']}.pdf")
