from django.shortcuts import render

from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
#from django.template import loader
from django.core.exceptions import ValidationError

from .models import Sale, Product, ProductCategory, Payment
from .forms import ImportProductsForm, PurchaseForm, LineaFormSet, ReconciliationJarForm

import csv
import io


def index(request):
    return render(request, 'don_confiao/index.html')


def buy(request):
    if request.method == "POST":
        sale_form = PurchaseForm(request.POST)
        sale_linea_form = LineaFormSet(request.POST)
        if sale_form.is_valid() and sale_linea_form.is_valid():
            sale = sale_form.save()
            lines = sale_linea_form.save(commit=False)
            for line in lines:
                line.sale = sale
                line.save()
            return HttpResponseRedirect("compras")
    else:
        sale_form = PurchaseForm()
        sale_linea_form = LineaFormSet()
    return render(
        request,
        'don_confiao/purchase.html',
        {
            'sale_form': sale_form,
            'linea_formset': sale_linea_form
        }
    )


def purchases(request):
    purchases = Sale.objects.all()
    context = {
        "purchases": purchases,
    }
    return render(request, 'don_confiao/purchases.html', context)


def products(request):
    rproducts = []
    products = Product.objects.all()
    for product in products:
        rproduct = {
            "name": product.name,
            "price_list": product.price,
            "uom": product.measuring_unit,
            "categories": [c.name for c in product.categories.all()]
        }
        rproducts.append(rproduct)

    return JsonResponse(rproducts, safe=False)


def import_products(request):
    if request.method == "POST":
        form = ImportProductsForm(request.POST, request.FILES)
        if form.is_valid():
            handle_import_products_file(request.FILES["csv_file"])
            return HttpResponseRedirect("productos")
    else:
        form = ImportProductsForm()
    return render(
        request,
        "don_confiao/import_products.html",
        {'form': form}
    )


def reconciliate_jar(request):
    summary = Payment.get_reconciliation_jar_summary()
    if request.method == 'POST':
        form = ReconciliationJarForm(request.POST)
        if form.is_valid():
            reconciliation = form.save()
            reconciliation.add_payments(summary.payments)
            reconciliation.clean()
            reconciliation.save()
            return HttpResponseRedirect('cuadres')
    else:
        form = ReconciliationJarForm()
    return render(
        request,
        "don_confiao/reconciliate_jar.html",
        {'summary': summary, 'form': form}
    )

def reconciliations(request):
    return HttpResponse('<h1>Reconciliaciones</h1>')

def _categories_from_csv_string(categories_string, separator="&"):
    categories = categories_string.split(separator)
    clean_categories = [c.strip() for c in categories]
    return [_category_from_name(category) for category in clean_categories]


def _category_from_name(name):
    return ProductCategory.objects.get_or_create(name=name)[0]


def handle_import_products_file(csv_file):
    data = io.StringIO(csv_file.read().decode('utf-8'))
    reader = csv.DictReader(data, quotechar='"')
    for row in reader:
        product, created = Product.objects.update_or_create(
            name=row['producto'],
            defaults={
                'price': row['precio'],
                'measuring_unit': row['unidad']
            }
        )
        categories = _categories_from_csv_string(row["categorias"])
        product.categories.clear()
        for category in categories:
            product.categories.add(category)