from django.shortcuts import render,redirect
from django.contrib.auth import authenticate,login
from django.contrib.auth.decorators import login_required,user_passes_test
from django.contrib.admin.views.decorators import staff_member_required
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse, JsonResponse
from django.template import Context, loader, RequestContext
from django.template.loader import render_to_string
from django.contrib.auth.models import User
from rh.models import UserProfile,Area
from ventas.models import Utr,Factura,StatusConstruccion,Proyecto,Post,Comentario,PostVistas
from .decorators import ajax_request_only
from .models import Client
from django.conf import settings
from dateutil import tz
from datetime import datetime,date
from django.db.models import Q
import json

local_zone = tz.tzlocal()

SERVICIOS = {
    'SR':'SERVICIO',
    'RF':'REFACCIONES',
    'EQ':'EQUIPOS',
    'IP':'INTEGRACIÓN / PROYECTO',
    'CP':'CAPACITACIÓN'
}

MONEDAS = {
    'MXN':'MXN',
    'USD':'USD',
    'EUR':'EUR',
    'GBP':'GBP',
}

STATUS = {
        'ING':'ETAPA DE INGENIERÍA',
        'ACO':'APROBADO PARA CONSTRUCCIÓN',
        'PFA':'EN PROCESO DE FABRICACIÓN',
        'TRC':'TERMINADO EN REVISIÓN DE CALIDAD',
        'EPE':'EN PROCESO DE ENTREGA',
        'ENT':'ENTREGADO',
}

#######################
#       VIEWS     #####
#######################

def login_view(request):
    msg = None
    if request.method == "POST":
        user = authenticate(username=request.POST['username'], password=request.POST['password'])
        if user is not None:
            login(request, user)
            return redirect("/")
        else:
            msg = 'Usuario o contraseña incorrectos'
    return render(request, "login.html", {"msg": msg})

@login_required(login_url='/login/')
def inicio(request):
    return render(request, "mainsite/index.html")

@ajax_request_only
@login_required(login_url='/login/')
@user_passes_test(lambda u: u.is_superuser)
@staff_member_required
def setup(request):
    return HttpResponse(render_to_string("mainsite/setup.html",{'request':request}))

@ajax_request_only
@login_required(login_url='/login')
def menu(request):
    return HttpResponse(render_to_string("mainsite/menu.html", {"request": request}))

@ajax_request_only
@login_required(login_url='/login/')
@user_passes_test(lambda u: u.is_superuser)
@staff_member_required
def users(request):
    usrs = UserProfile.objects.all()
    return HttpResponse(render_to_string("mainsite/users.html",{'request':request,'usrs':usrs}))

@ajax_request_only
@login_required(login_url='/login/')
@user_passes_test(lambda u: u.is_superuser)
@staff_member_required
def clients(request):
    clients = Client.objects.all()
    return HttpResponse(render_to_string("mainsite/clients.html",{'request':request,'clients':clients}))

@ajax_request_only
@login_required(login_url='/login/')
@user_passes_test(lambda u: u.is_superuser)
@staff_member_required
def areas(request):
    areas = Area.objects.all()
    return HttpResponse(render_to_string("mainsite/areas.html",{'request':request,'areas':areas}))

@ajax_request_only
@login_required(login_url='/login')
@user_passes_test(lambda u: u.is_superuser)
@staff_member_required
def userinfo(request):
    user = UserProfile.objects.get(id=int(request.GET['id']))
    clients = Client.objects.all()
    areas = Area.objects.all()
    try:
        branch = Client.objects.get(nombre=settings.EMPRESA)
    except:
        branch = None
    return HttpResponse(render_to_string("mainsite/user-info.html",{"request": request,"user":user,"clients":clients,"branch":branch,"areas":areas}))

@ajax_request_only
@login_required(login_url='/login')
@user_passes_test(lambda u: u.is_superuser)
@staff_member_required
def clientinfo(request):
    client = Client.objects.get(id=int(request.GET['id']))
    return HttpResponse(render_to_string("mainsite/client-info.html",{"request": request,"client":client}))

@ajax_request_only
@login_required(login_url='/login')
def projectinfo(request):
    pr = Proyecto.objects.get(id=int(request.GET['id']))
    clients = Client.objects.all()
    users = UserProfile.objects.filter(cliente=pr.cliente)
    return HttpResponse(render_to_string("mainsite/project-info.html",{"request": request,"project":pr,'clients':clients,'services':SERVICIOS,'currency':MONEDAS,'users':users,'status':STATUS}))

@ajax_request_only
@login_required(login_url='/login')
@user_passes_test(lambda u: u.is_superuser)
@staff_member_required
def areainfo(request):
    area = Area.objects.get(id=int(request.GET['id']))
    areas = Area.objects.all().exclude(nombre=area.nombre)
    aes = [a for a in areas]
    par = [a for a in aes if a.parent is not None]
    for a in areas:
        if a.parent == area and a in par:
            aes.remove(a)
    users = UserProfile.objects.filter(cliente__nombre=settings.EMPRESA)
    return HttpResponse(render_to_string("mainsite/area-info.html",{"request": request,"area":area,"areas":aes,"users":users}))

@ajax_request_only
@login_required(login_url='/login')
def downloadcsv(request):
    data = "Forbiden"
    fname = 'response.csv'
    if request.GET['data'] == 'users' and request.user.is_superuser:
        usrs = UserProfile.objects.all()
        data = "usuario,nombre,apellido,email,empresa,activo%0A"
        for u in usrs:
            data += str(u.usuario.username) + "," + str(u.nombre) + "," + str(u.apellido) + "," + str(u.usuario.email) + "," + str(u.cliente) + "," + str(u.status) + "%0A"
        fname = 'usuarios.csv'    
    elif request.GET['data'] == 'clients' and request.user.is_superuser:
        clients = Client.objects.all()
        data = "nombre,rfc,contacto,tel%E9fono,activo%0A"
        for c in clients:
            data += str(c.nombre) + "," + str(c.rfc) + "," + str(c.contacto) + "," + str(c.telefono) + "," + str(c.activo) + "%0A"
        fname = 'clientes.csv'
    elif request.GET['data'] == 'areas' and request.user.is_superuser:
        areas = Area.objects.all()
        data = "nombre,padre%0A"
        for a in areas:
            if a.parent is not None:
                data += str(a.nombre) + "," + str(a.parent.nombre) + "%0A"
            else:
                data += str(a.nombre) + ",-%0A"
        fname = 'areas.csv'
    return JsonResponse({'data':data,'fname':fname})

@ajax_request_only
@login_required(login_url='/login')
@user_passes_test(lambda u: u.is_superuser)
@staff_member_required
def updatedata(request):
    try:
        if request.POST['obj'] == 'UserProfile':
            obj = UserProfile.objects.filter(id=request.POST['id']).update(**{request.POST['field']:request.POST["data[val]"]})
        elif request.POST['obj'] == 'User':
            obj = User.objects.filter(id=request.POST['id']).update(**{request.POST['field']:request.POST["data[val]"]})
        elif request.POST['obj'] == 'Client':
            obj = Client.objects.filter(id=request.POST['id']).update(**{request.POST['field']:request.POST["data[val]"]})
        elif request.POST['obj'] == 'Area':
            if request.POST['field'] == 'responsables':
                obj = Area.objects.get(id=request.POST['id'])
                obj.responsables.clear()
                obj.save()
                data = json.loads(request.POST['data'])
                for r in data:
                    obj.responsables.add(User.objects.get(id=r))
                obj.save()
            else:
                obj = Area.objects.filter(id=request.POST['id']).update(**{request.POST['field']:request.POST["data[val]"]})
        elif request.POST['obj'] == 'Project':
            if request.POST['field'] == 'status_construccion':
                obj = Proyecto.objects.get(id=request.POST['id'])
                exist = False
                for x in obj.status_construccion.all():
                    if request.POST["data[val]"] == x.status:
                        exist = True
                if not exist:
                    st = StatusConstruccion()
                    st.creado_por = request.user
                    st.status = request.POST["data[val]"]
                    st.save()
                    if st.status == "ENT":
                        obj.fecha_entrega_real = date.today()
                    obj.status_construccion.add(st)
                    obj.save()
            else:
                obj = Proyecto.objects.filter(id=request.POST['id']).update(**{request.POST['field']:request.POST["data[val]"]})
        elif request.POST['obj'] == 'Utr':
            obj = Utr.objects.filter(id=request.POST['id']).update(**{request.POST['field']:request.POST["data[val]"]})
        elif request.POST['obj'] == 'Factura':
            obj = Factura.objects.filter(id=request.POST['id']).update(**{request.POST['field']:request.POST["data[val]"]})
        msg = "Ok"
        return JsonResponse({'data':msg})
    except Exception as ex:
        return JsonResponse({'data':"ERR:"+str(ex)})
    
@ajax_request_only
@login_required(login_url='/login')
@user_passes_test(lambda u: u.is_superuser)
@staff_member_required
@csrf_exempt
def uploaddata(request):
    if request.POST['obj'] == 'UserProfile':
        obj = UserProfile.objects.get(id=request.POST['id'])
        obj.foto = request.FILES['file']
        obj.save()
    elif request.POST['obj'] == 'Client':
        obj = Client.objects.get(id=request.POST['id'])
        obj.logo = request.FILES['file']
        obj.save()
    elif request.POST['obj'] == 'Factura':
        obj = Factura.objects.get(id=request.POST['id'])
        obj.archivo = request.FILES['file']
        obj.save()
    elif request.POST['obj'] == 'Utr':
        obj = Utr.objects.get(id=request.POST['id'])
        obj.archivo = request.FILES['file']
        obj.save()
    elif request.POST['obj'] == 'Nota':
        obj = Post.objects.get(id=request.POST['id'])
        obj.archivo = request.FILES['file']
        obj.save()
    elif request.POST['obj'] == 'Comentario':
        obj = Comentario.objects.get(id=request.POST['id'])
        obj.archivo = request.FILES['file']
        obj.save()
    return JsonResponse({'data':"Success"})

@ajax_request_only
@login_required(login_url='/login')
def getdata(request):
    usrs = {}
    if request.GET['obj'] == 'UserProfile':
        client = Client.objects.get(id=request.GET['id'])
        users = UserProfile.objects.filter(cliente=client)
        for u in users:
            usrs[u.id] = u.nombre + " " + u.apellido
    return JsonResponse(usrs)
        

@ajax_request_only
@login_required(login_url='/login/')
def projects(request):
    print(request.GET)
    if request.user.is_superuser:
        prs = Proyecto.objects.all()
    else:
        usr = UserProfile.objects.get(usuario=request.user)
        if request.user in usr.cliente.admins.all():
            prs = Proyecto.objects.filter(cliente=usr.cliente)
        else:
            prs = Proyecto.objects.filter(contacto_tecnico=request.user)
    if request.GET['id'] != "-":
        if request.GET['id'] != "":
            prs = prs.filter(Q(orden_de_compra=request.GET['id']) | Q(sales_order=request.GET['id']))
    return HttpResponse(render_to_string("mainsite/projects.html",{'request':request,'projects':prs}))

@ajax_request_only
@login_required(login_url='/login/')
@user_passes_test(lambda u: u.is_superuser)
def addproject(request):
    clients = Client.objects.all()
    users = UserProfile.objects.all()
    return HttpResponse(render_to_string("mainsite/addproject.html",{'request':request,'clients':clients,'services':SERVICIOS,'currency':MONEDAS,'users':users}))

@ajax_request_only
@login_required(login_url='/login/')
def newproject(request):
    pr = Proyecto()
    pr.creado_por = request.user
    pr.cliente = Client.objects.get(id=request.POST['client'])
    pr.tipo = request.POST['tipo']
    pr.usuario_final = request.POST['usuario_final']
    pr.contacto_tecnico = User.objects.get(id=request.POST['contacto_tecnico'])
    pr.orden_de_compra = request.POST['orden_de_compra']
    pr.sales_order = request.POST['sales_order']
    pr.fecha_pedido = datetime.strptime(request.POST['fecha_pedido'], '%Y-%m-%d').astimezone(local_zone)
    pr.fecha_entrega_solicitada = datetime.strptime(request.POST['fecha_entrega_solicitada'], '%Y-%m-%d').astimezone(local_zone)
    pr.descripcion = request.POST['descripcion']
    pr.monto = float(request.POST['monto'])
    pr.moneda = request.POST['moneda']
    pr.save()
    st = StatusConstruccion()
    st.creado_por = request.user
    st.save()
    pr.status_construccion.add(st)
    pr.save()
    return redirect('projects')

@ajax_request_only
@login_required(login_url='/login/')
def newutr(request):
    u = Utr()
    u.nombre = request.POST['nombre']
    u.serial = request.POST['serial']
    u.imei = request.POST['imei']
    u.save()
    pr = Proyecto.objects.get(id=request.POST['project'])
    pr.utrs.add(u)
    pr.save()
    clients = Client.objects.all()
    users = UserProfile.objects.filter(cliente=pr.cliente)
    return HttpResponse(render_to_string("mainsite/project-info.html",{"request": request,"project":pr,'clients':clients,'services':SERVICIOS,'currency':MONEDAS,'users':users,'status':STATUS}))

@ajax_request_only
@login_required(login_url='/login/')
def newfactura(request):
    f = Factura()
    f.factura = request.POST['factura']
    f.fecha_facturacion = datetime.strptime(request.POST['fecha_facturacion'], '%Y-%m-%d').astimezone(local_zone)
    f.descripcion = request.POST['descripcion']
    f.save()
    pr = Proyecto.objects.get(id=request.POST['project'])
    pr.facturas.add(f)
    pr.save()
    clients = Client.objects.all()
    users = UserProfile.objects.filter(cliente=pr.cliente)
    return HttpResponse(render_to_string("mainsite/project-info.html",{"request": request,"project":pr,'clients':clients,'services':SERVICIOS,'currency':MONEDAS,'users':users,'status':STATUS}))

@ajax_request_only
@login_required(login_url='/login/')
def newnota(request):
    n = Post()
    n.titulo = request.POST['titulo']
    n.post = request.POST['nota']
    n.creado_por = request.user
    n.save()
    pr = Proyecto.objects.get(id=request.POST['project'])
    pr.notas.add(n)
    pr.save()
    clients = Client.objects.all()
    users = UserProfile.objects.filter(cliente=pr.cliente)
    return HttpResponse(render_to_string("mainsite/project-info.html",{"request": request,"project":pr,'clients':clients,'services':SERVICIOS,'currency':MONEDAS,'users':users,'status':STATUS}))

@ajax_request_only
@login_required(login_url='/login/')
def newcomentario(request):
    n = Comentario()
    n.comentario = request.POST['comentario']
    nota = Post.objects.get(id=request.POST['nota_id_comentario'])
    n.post = nota
    n.creado_por = request.user
    n.save()
    pr = Proyecto.objects.get(id=request.POST['project'])
    clients = Client.objects.all()
    users = UserProfile.objects.filter(cliente=pr.cliente)
    return HttpResponse(render_to_string("mainsite/project-info.html",{"request": request,"project":pr,'clients':clients,'services':SERVICIOS,'currency':MONEDAS,'users':users,'status':STATUS}))
    