# Copyright (C) 2020 by Animath
# SPDX-License-Identifier: GPL-3.0-or-later

import os

from django.contrib.auth.models import User
from django.core.management import BaseCommand
import requests


class Command(BaseCommand):
    def handle(self, *args, **options):  # noqa: C901
        organization = "animath"
        form_slug = "tfjmm-2018"
        from_date = "2000-01-01"
        url = f"https://api.helloasso.com/v5/organizations/{organization}/forms/Event/{form_slug}/payments" \
              f"?from={from_date}&pageIndex=1&pageSize=10000&retrieveOfflineDonations=false"
        headers = {
            "Accept": "application/json",
            "Authorization": f"Bearer {os.getenv('HELLO_ASSO_TOKEN', '')}",
        }
        http_response = requests.get(url, headers=headers)
        response = http_response.json()

        if http_response.status_code != 200:
            message = response["message"]
            self.stderr.write(f"Error while querying Hello Asso: {message}")
            return

        for payment in response:
            if payment["state"] != "Authorized":
                continue

            payer = payment["payer"]
            email = payer["email"]
            qs = User.objects.filter(email=email)
            if not qs.exists():
                self.stderr.write(f"Warning: a payment was found by the email address {email}, "
                                  "but this user is unknown.")
                continue
            user = qs.get()
            if not user.registration.participates:
                self.stderr.write(f"Warning: a payment was found by the email address {email}, "
                                  "but this user is not a participant.")
                continue
            payment_obj = user.registration.payment
            payment_obj.valid = True
            payment_obj.type = "helloasso"
            payment_obj.additional_information = f"Identifiant de transation : {payment['id']}\n" \
                                                 f"Date : {payment['date']}\n" \
                                                 f"Reçu : {payment['paymentReceiptUrl']}\n" \
                                                 f"Montant : {payment['amount'] / 100:.2f} €"
            payment_obj.save()
            self.stdout.write(f"{payment_obj} is validated")