# 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
        # Get access token
        response = requests.post('https://api.helloasso.com/oauth2/token', headers={
            'Content-Type': 'application/x-www-form-urlencoded',
        }, data={
            'client_id': os.getenv('HELLOASSO_CLIENT_ID', ''),
            'client_secret': os.getenv('HELLOASSO_CLIENT_SECRET', ''),
            'grant_type': 'client_credentials',
        }).json()

        token = response['access_token']

        organization = "animath"
        form_slug = "tfjm-2021"
        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 {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["data"]:
            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")