# ohathor/views.py

from django.shortcuts import render, get_object_or_404, redirect

# Create your views here.
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator

# specific to this view
from django.views.generic import ListView
from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView
from django.views.generic.detail import DetailView, SingleObjectMixin
from django.urls import reverse_lazy
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage

# Importar todos los modelos
from .models import *
# Importar forms
from .forms import InventoryForm
# Importar filtros
from .filters import InventoryFilter


@login_required
def index(request):
    latest_business_list = T001_BUSINESS.objects.order_by('-created_at')[:5]
    context = {'latest_business_list': latest_business_list}
    return render(request, 'ohathor/index.html', context)


def t001_business_detail(request, t001_business_id):
    business = get_object_or_404(T001_BUSINESS, pk=t001_business_id)
    return render(request, 'ohathor/detail.html', {'business': business})


def asset_home(request):
    tables_list = ('T001_BUSINESS', 'T002_GOB', 'T003_AUXILIAR')
    context = {'tables_list': tables_list}
    form = BaseOhathorForm()
    return render(request, 'ohathor/asset.html', {'form': form})


@method_decorator(login_required, name='dispatch')
class GenericListView(ListView):

    model = T100_INVENTORY
    template_name = 'ohathor/generic_list.html'
    context_object_name = 'items'
    paginate_by = 2

    def get_context_data(self, **kwargs):
        context = super(GenericListView, self).get_context_data(**kwargs)
        items = self.get_queryset()
        page = self.request.GET.get('page')
        paginator = Paginator(items, self.paginate_by)
        try:
            items = paginator.page(page)
        except PageNotAnInteger:
            items = paginator.page(1)
        except EmptyPage:
            items = paginator.page(paginator.num_pages)
        context = {'items': items,
                   'model': 'INVENTARIO'}
        return context


@method_decorator(login_required, name='dispatch')
class GenericCreateView(CreateView):
    model = T100_INVENTORY
    template_name = 'ohathor/generic_create.html'
    fields = ('pater', 'code', 'alias', 'name', 'detail', )
    success_url = reverse_lazy('ohathor:generic-list')


@method_decorator(login_required, name='dispatch')
class GenericDetailView(DetailView):

    model = T100_INVENTORY
    template_name = 'ohathor/generic_detail.html'
    context_object_name = 'item'


@method_decorator(login_required, name='dispatch')
class GenericUpdateView(UpdateView):

    model = T100_INVENTORY
    template_name = 'ohathor/generic_update.html'
    context_object_name = 'item'
    fields = ('code', 'alias', 'name', 'detail', )

    def get_success_url(self):
        return reverse_lazy('ohathor:generic-detail', kwargs={'pk': self.object.id})


@method_decorator(login_required, name='dispatch')
class GenericDeleteView(DeleteView):
    model = T100_INVENTORY
    template_name = 'ohathor/generic_delete.html'
    success_url = reverse_lazy('ohathor:generic-list')


# --------- INVENTORY VIEWS ---------

def InventorySearch(request, *args, **kwargs):
    ''' Lista de inventario con filtros'''
    name = 'Inventory List'
    queryset = T100_INVENTORY.objects.all()
    # queryset = T100_INVENTORY.objects.filter(enabled=True)
    filter = InventoryFilter(request.GET, queryset=queryset)
    # Paginador
    paginate_by = 10
    paginator = Paginator(filter.qs, paginate_by)
    page = request.GET.get('page')
    try:
        pages = paginator.page(page)
    except PageNotAnInteger:
        pages = paginator.page(1)
    except EmptyPage:
        pages = paginator.page(paginator.num_pages)
    context = {'filter': filter,
               'pages': pages,
               'name': name
               }
    return render(request, 'ohathor/search/inventory_list.html', context)


class InventoryDetailView(DetailView):
    ''' Detalle de un registro'''
    queryset = T100_INVENTORY.objects.all()
    template_name = 'ohathor/search/inventory_detail.html'
    context_object_name = 'item'


class InventoryCreateView(CreateView):
    '''Creación de un registro'''
    model = T100_INVENTORY
    template_name = 'ohathor/search/inventory_create.html'
    fields = '__all__'
    success_url = reverse_lazy('ohathor:inventory-search')


class InventoryDeleteView(DeleteView):
    ''' Borrado de un registro'''
    model = T100_INVENTORY
    template_name = 'ohathor/search/inventory_delete.html'
    success_url = reverse_lazy('ohathor:inventory-search')


class InventoryUpdateView(UpdateView):
    ''' Edicion actualización de un registro '''
    model = T100_INVENTORY
    template_name = 'ohathor/search/inventory_edit.html'
    context_object_name = 'item'
    # fields = ('code', 'alias', 'name', 'detail', )
    fields = '__all__'

    def get_success_url(self):
        return reverse_lazy('ohathor:inventory-detail', kwargs={'pk': self.object.id})
