# -*- coding: utf-8 -*-
import datetime
from dateutil.relativedelta import relativedelta
from django.http import HttpResponse
from django.db.models import Q
from coin.offers.models import Offer, OfferSubscription
from coin.members.models import Member
from coin.billing.models import Invoice, InvoiceDetail


def generate_missing_invoices(request):
	"""
	Pour chaque abonnement (OfferSubscription):
		Vérifie pour chaque période de facturation si elle a été facturée
		Sinon génère la facture correspondante
	"""
	members = Member.objects.filter(
		Q(offersubscription__resign_date__isnull=True) | Q(offersubscription__resign_date__gte=datetime.date.today()))
	offer_subscriptions = OfferSubscription.objects.filter(
		Q(resign_date__isnull=True) | Q(resign_date__gte=datetime.date.today()))
	sortie = ""
	for member in members:
		sortie += '<br /> %s - %s' % (member, 
			generate_invoice_for_a_period(member, datetime.date(2014,5,17)))

	return HttpResponse(sortie)


def generate_invoice_for_a_period(member, date):
	"""
	Génère si necessaire une facture pour un membre en prenant la date passée 
	en paramètre comme premier mois de période. Renvoi la facture générée
	ou None si aucune facture n'était necessaire.
	"""
	invoice = None

	# Récupère les abonnements en cours du membre
	offer_subscriptions = (
		OfferSubscription.get_member_offer_subscriptions(member,date))

	#Pour chaque abonnement
	for offer_subscription in offer_subscriptions:
		#Récupère l'offre de l'abonnement
		offer = offer_subscription.offer

		# Recherche les factures déjà existantes de ce membre ayant cette offre
		# comme item pour lesquels la période de facturation englobe la date
		invoice_test = Invoice.objects.filter(
			details__offer__exact=offer.pk,
			details__period_from__lte=date,
			details__period_to__gte=date,
			member__exact=member.pk)

		#Si une telle facture n'existe pas
		if not invoice_test.exists():
			#Si l'object facture n'a pas encore été créé, le créé
			if invoice == None:
				invoice = Invoice.objects.create(
					date_due=datetime.date.today(),
					member=member
				)

			#Ajout l'item de l'offre correspondant à l'abonnement à la facture			
			invoice.details.create(label=offer.name,
				amount=offer.period_fees,
				offer=offer,
				period_from=datetime.date(date.year,date.month,1),
				period_to=(datetime.date(date.year,date.month,1) +
							relativedelta(months = +offer.billing_period) -
							relativedelta(days = +1)))

			invoice.save();

	return invoice
