# 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
from django.db.models import Q
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-2023-tournois-regionaux"
        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=100&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"]
            last_name = payer["lastName"]
            first_name = payer["firstName"]
            base_filter = Q(
                registration__participantregistration__isnull=False,
                registration__participantregistration__team__isnull=False,
                registration__participantregistration__team__participation__valid=True,
            )
            qs = User.objects.filter(
                    base_filter,
                    email=email,
            )
            if not qs.exists():
                qs = User.objects.filter(
                        base_filter,
                        last_name__icontains=last_name,
                )
                if qs.count() >= 2:
                    qs = qs.filter(first_name__icontains=first_name)
            if not qs.exists():
                self.stderr.write(f"Warning: a payment was found by {first_name} {last_name} ({email}), "
                                  "but this user is unknown.")
                continue
            if qs.count() > 1:
                self.stderr.write(f"Warning: a payment was found by {first_name} {last_name} ({email}), "
                                  f"but there are {qs.count()} matching users.")
                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")
