# -*- coding: utf-8 -*-
from django.shortcuts import render 
from django.http import HttpResponse
from django.views.generic import TemplateView, DetailView
from django.contrib.auth.models import User
from .models import Profesional, Pago
# from django.contrib.auth.decorators import login_required
from django.views.generic.base import View
from io import BytesIO
from reportlab.pdfgen import canvas
from reportlab.platypus import Image
from reportlab.pdfbase.pdfmetrics import stringWidth
from reportlab.rl_config import defaultPageSize
from reportlab.lib.colors import red, black,white, blue
from reportlab.graphics.barcode import *
from reportlab.graphics.barcode import code128
from reportlab.graphics.barcode.common import Codabar
from reportlab.graphics.barcode.code128 import *
from reportlab.graphics.shapes import Drawing
from reportlab.graphics import renderPDF
from reportlab.lib.units import mm
from datetime import date
from users.models import CustomUser
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
import codecs
import barcode
# from django.template import RequestContext, loader, Context

PAGE_WIDTH  = defaultPageSize[0]
PAGE_HEIGHT = defaultPageSize[1]
render_pagos = []


class ChequerasPageView(TemplateView):
    '''Funcion que carga la plantilla chequeras''' 
    
    def get(self, request, *args, **kwargs):
        template_name = 'chequeras/chequeras.html'
        status = 200
        context = request
        current_user = request.user
        aux_prof = Profesional.objects.filter(codigo_id=current_user.id)

        
        aux = Pago.objects.filter(usuario_codigo_id=current_user.id)
        anio = date.today().year
        mes = date.today().month

        render_pagos[:]=[]
        print (aux)
        if aux.exists():
        #for w in aux_prof.all():
            if aux_prof[0].activo_col == 1:
                for i in aux.all():
                    if i.tipo_pago == 'C':
                        render_pagos.append(i) 
            if aux_prof[0].activo_seg == 1:
                for i in aux.all():
                    if i.tipo_pago == 'S':
                        render_pagos.append(i)
        
        return render(request, template_name, {'obj': render_pagos},context, status=status)

class generar_pdf(TemplateView):
    ''' Clase que genera el pdf '''
    
    global ancho
    global inicio   
    ancho = 554
    inicio = 22
    def get(self, request, id_pago):
        ''' funcion que genera el pdf '''
        
        '''
            parametros:
            ------------
            id_pago: numero que identifica al pago
        
        '''
        
        
        response = HttpResponse(content_type='application/pdf')
        response['Content-Disposition'] = 'filename="somefilename.pdf"'
        result_pago = Pago.objects.filter(id_pago=id_pago)
    
        for i in result_pago:
            id_usuario = i.usuario_codigo_id
            pesos = i.pesos
            pesos_char = i.pesos_char
            codigo_link = i.cod_link
            codigo_pago_mc = i.cod_pago_mc
            tipo = i.tipo_pago
            periodo = i.periodo
            vencimiento_1 = str(i.vencimiento_1.day)+'-'+str(i.vencimiento_1.month)+'-'+str(i.vencimiento_1.year)
            pago_mc = i.cod_pago_mc
            pago_link = i.cod_link
            cod_barras = i.cod_barras
            

        result_user = CustomUser.objects.filter(id = id_usuario)   
        for i in result_user:
            nombre = i.first_name + ' ' + i.last_name

        result_user = Profesional.objects.filter(codigo_id = id_usuario)   
        for i in result_user:
        	matricula = i.matricula


        p = canvas.Canvas(response)
        if (tipo == 'C' ):
            p = self.cabecera_col(p, periodo)
            p = self.cuerpo_col(p, nombre, periodo, vencimiento_1, pesos, pesos_char, pago_mc, pago_link, matricula)
            p = self.codigo_de_barras(p, cod_barras)
            p.roundRect(inicio, 526, ancho, 100, 4, stroke=1, fill=0)
            p.setFont('Helvetica', 7)
            p.setFillColor(red)
            p.drawString(102, 530, 'SR. PROFESIONAL RECUERDE QUE EL ATRASO DE LAS CUOTAS OCASIONA LA ACTUALIZACION DE LAS MISMAS')
            filename = 'Colegiacion_' + periodo + '_mat_' +str(matricula)

        elif (tipo == 'S'):
            p = self.cabecera_sap(p, periodo)
            p = self.cuerpo_sap(p, nombre, periodo, vencimiento_1, pesos, pesos_char, pago_mc, pago_link, matricula)
            p = self.codigo_de_barras(p, cod_barras)
            #recuadro y texto del codigo de barras
            p.roundRect(inicio, 526, ancho, 100, 4, stroke=1, fill=0)
            p.setFont('Helvetica', 7)
            p.setFillColor(blue)
            p.drawString(80, 530, 'SR. PROFESIONAL RECUERDE QUE LA FALTA DE PAGO DE 3 (TRES) PERIODOS IMPLICA LA EXCLUSION AUTOMATIZA DEL SAP RC')
            filename = 'SAP_' + periodo + '_mat_' + str(matricula)
        elif (tipo == 'A'):
            if (periodo == 'AJUSTEC'):
                p = self.cabecera_col(p, 'AJUSTE 2016')
                p = self.cuerpo_colegiacion_ajuste(p, nombre, 'AJUSTE', vencimiento_1, pesos, pesos_char, pago_mc, pago_link, matricula)
                p = self.codigo_de_barras(p, cod_barras)
                #recuadro y texto del codigo de barras
                p.roundRect(inicio, 526, ancho, 100, 4, stroke=1, fill=0)
                p.setFont('Helvetica', 7)
                p.setFillColor(red)
                filename = 'Colegiacion_' + 'Ajuste_2016' + '_mat_' + str(matricula)  
            else:
                p = self.cabecera_sap(p, 'AJUSTE 2016')
                p = self.cuerpo_sap_ajuste(p, nombre, 'AJUSTE', vencimiento_1, pesos, pesos_char, pago_mc, pago_link, matricula)
                p = self.codigo_de_barras(p, cod_barras)
                #recuadro y texto del codigo de barras
                p.roundRect(inicio, 526, ancho, 100, 4, stroke=1, fill=0)
                p.setFont('Helvetica', 7)
                p.setFillColor(blue)
                filename = 'SAP_' + 'Ajuste_2016' + '_mat_' + str(matricula)               

        response['Content-Disposition'] = 'attachment; filename=' + filename + '.pdf'
        p.setTitle(filename)
        p.showPage()
        p.save()
        return response

    def cabecera_col(self, p, periodo):
        ''' funcion que genera la cabecera del pdf para la cuota de colegiacion'''
        
        '''
            parametros:
            ------------
            p: objeto pdf
            periodo: mes correspondiente al pago

            return:
            ------------
            p: objeto pdf con la cabecera
        '''
        

        p.setFillColor(red)
        p.setStrokeColor(red)
        p.setFont('Helvetica', 16)
        p.drawString(130, 805, 'COLEGIO DE MÉDICOS')
        p.setFont('Helvetica', 10)
        p.drawString(148, 790, '1ª Circunscripción - Santa Fe')
        p.drawString(147, 775, '9 de Julio 2464 (3000) Santa Fe')
        p.drawString(133, 760, 'Tel: (0342) 4520182 - 4520176 (int 2)')

        p.setFillColor(red)
        p.setStrokeColor(red)
        p.roundRect(inicio, 730, ancho, 100, 4, stroke=1, fill=0)
        p.roundRect(320, 730, 172, 100, 4, stroke=1, fill=0)
        logo_col_path='/home/dario/Documentos/django/djangox/static/images/logo_colegio_c.jpg'
        #logo_col_path=static('images/logo_colegio_c.jpg')
        
        logo_prov_path='/home/dario/Documentos/django/djangox/static/images/logo_santafe_c.jpg'
        p.setFont('Helvetica', 16)
        p.drawImage(logo_col_path, 30, 750, width=75, height=75)
        p.drawImage(logo_prov_path, 500, 750, width=75, height=75)
        p.setFont('Helvetica', 24)
        p.drawString(323, 790, 'COLEGIACIÓN')
        p.setFont('Helvetica', 24)
        if (periodo == 'AJUSTE 2016'):
            p.drawString(332, 760, periodo)
        else:
            p.drawString(360, 760, periodo)
        return p


    def cabecera_sap(self, p, periodo):
        ''' funcion que genera la cabecera del pdf para la cuota de sap'''
        
        '''
            parametros:
            ------------
            p: objeto pdf
            periodo: mes correspondiente al pago

            return:
            ------------
            p: objeto pdf con la cabecera
        '''   
 
        
        p.setFillColor(blue)
        p.setStrokeColor(blue)
        p.setFont('Helvetica', 16)
        p.drawString(130, 805, 'COLEGIO DE MEDICOS')
        p.setFont('Helvetica', 10)
        p.drawString(148, 790, '1ª Circunscripción - Santa Fe')
        p.drawString(147, 775, '9 de Julio 2464 (3000) Santa Fe')
        p.drawString(133, 760, 'Tel: (0342) 4520182 - 4520176 (int 2)')

        p.setFillColor(blue)
        p.setStrokeColor(blue)
        p.roundRect(inicio, 730, ancho, 100, 4, stroke=1, fill=0)
        p.roundRect(320, 730, 178, 100, 4, stroke=1, fill=0)
        logo_col_path='/home/dario/Documentos/django/djangox/static/images/logo_colegio_s.jpg'
        logo_prov_path='/home/dario/Documentos/django/djangox/static/images/logo_santafe_s.jpg'
        p.setFont('Helvetica', 16)
        p.drawImage(logo_col_path, 30, 750, width=75, height=75)
        p.drawImage(logo_prov_path, 500, 750, width=75, height=75)
        p.setFont('Helvetica', 40)
        p.drawString(336, 787, 'SAP RC')
        p.setFont('Helvetica', 36)
       
        if (periodo == 'AJUSTE 2016'):
            p.setFont('Helvetica', 26)
            p.drawString(330, 760, periodo)
        else:
            p.drawString(346, 753, periodo)
        return p

    def cuerpo_col(self, p, nombre, periodo, vencimiento_1, pesos, pesos_char, pago_mc, pago_link, matricula):
        ''' funcion que genera el cuerpo del pdf para la cuota de colegiacion'''
        
        '''
            parametros:
            ------------
            p: objeto pdf
            periodo: mes correspondiente al pago
            nombre: nommbre del asociado
            vencimiento_1: primer vencimiento
            pesos: valor de la cuota en numeros
            pesos_char: valor de la cuota en letras
            pago_mc: codigo de pago mis cuentas
            pago_link: codigo link
            matricula: numero de matricula del profesional

            return:
            ------------
            p: objeto pdf con la cabecera
        '''

        
        p.setFont('Helvetica', 14)
        p.setFillColor(red)
        p.setStrokeColor(red)
        p.roundRect(inicio, 704, ancho, 26, 4, stroke=1, fill=0)
        p.drawString(25, 710, 'ASOCIADO:')
        p.setFillColor(black)
        p.drawString(110, 710, nombre)
        p.setFillColor(red)
        p.drawString(430, 710, 'MATRICULA:')

        p.setFillColor(black)
        p.drawString(520, 710, str(matricula))

        p.roundRect(inicio, 678, ancho, 26, 4, stroke=1, fill=0)
        p.rect(100, 678, 70, 26)
        p.rect(285, 678, 80, 26)
        p.rect(365, 678, 80, 26)
        p.setFillColor(red)
        p.drawString(25, 685, 'PERIODO:')
        p.setFillColor(black)
        p.drawString(110, 685, periodo)
        p.setFillColor(red)
        p.drawString(178, 685, 'VENCIMIENTO:')
        p.setFillColor(black)
        p.drawString(290, 685, str(vencimiento_1))
        p.setFillColor(red)
        p.drawString(370, 685, 'IMPORTE:')
        p.setFillColor(black)
        p.drawString(450, 685, str(pesos))

        p.roundRect(inicio, 652, ancho, 26, 4, stroke=1, fill=0)
        p.setFillColor(red)
        p.drawString(25, 660, 'SON PESOS:')
        p.setFillColor(black)
        p.drawString(120, 660, pesos_char)

        
        p.roundRect(inicio, 626, ancho, 26, 4, stroke=1, fill=0)
        p.rect(127, 626, 154, 26)
        p.rect(281, 626, 211, 26)
        p.setFillColor(red)
        p.drawString(25, 635, 'CODIGO LINK:')
        p.setFillColor(black)
        p.drawString(130, 635, pago_link)

        p.setFillColor(red)
        p.drawString(285, 635, 'CODIGO PAGO MIS CUENTAS:')
        p.setFillColor(black)
        p.drawString(495, 635, pago_mc)

        return p
  
    def cuerpo_sap(self, p, nombre, periodo, vencimiento_1, pesos, pesos_char, pago_mc, pago_link, matricula):
        ''' funcion que genera el cuerpo del pdf para la cuota de sap'''
        
        '''
            parametros:
            ------------
            p: objeto pdf
            periodo: mes correspondiente al pago
            nombre: nommbre del asociado
            vencimiento_1: primer vencimiento
            pesos: valor de la cuota en numeros
            pesos_char: valor de la cuota en letras
            pago_mc: codigo de pago mis cuentas
            pago_link: codigo link

            return:
            ------------
            p: objeto pdf con la cabecera
        '''
        

        p.setFont('Helvetica', 14)
        p.setFillColor(blue)
        p.setStrokeColor(blue)  
        p.roundRect(inicio, 704, ancho, 26, 4, stroke=1, fill=0)
        p.drawString(25, 710, 'ASOCIADO:')
        p.setFillColor(black)
        p.drawString(110, 710, nombre)

        p.setFillColor(blue)
        p.drawString(430, 710, 'MATRICULA:')

        p.setFillColor(black)
        p.drawString(520, 710, str(matricula))

        p.roundRect(inicio, 678, ancho, 26, 4, stroke=1, fill=0)
        p.rect(100, 678, 70, 26)
        p.rect(285, 678, 80, 26)
        p.rect(365, 678, 80, 26)
        p.setFillColor(blue)
        p.drawString(25, 685, 'PERIODO:')
        p.setFillColor(black)
        p.drawString(110, 685, periodo)
        p.setFillColor(blue)
        p.drawString(178, 685, 'VENCIMIENTO:')
        p.setFillColor(black)
        p.drawString(290, 685, str(vencimiento_1))
        p.setFillColor(blue)
        p.drawString(370, 685, 'IMPORTE:')
        p.setFillColor(black)
        p.drawString(450, 685, str(pesos))
        p.roundRect(inicio, 652, ancho, 26, 4, stroke=1, fill=0)
        p.setFillColor(blue)
        p.drawString(25, 660, 'SON PESOS:')
        p.setFillColor(black)
        p.drawString(120, 660, pesos_char)

        p.setFillColor(blue)
        p.drawString(25, 635, 'CODIGO LINK:')
        p.setFillColor(black)
        p.drawString(130, 635, pago_link)
        
        p.roundRect(inicio, 626, ancho, 26, 4, stroke=1, fill=0)
        p.rect(127, 626, 154, 26)
        p.rect(281, 626, 211, 26)
        p.setFillColor(blue)
        p.drawString(285, 635, 'CODIGO PAGO MIS CUENTAS:')
        p.setFillColor(black)
        p.drawString(495, 635, pago_mc)
        return p

    def cuerpo_colegiacion_ajuste(self, p, nombre, periodo, vencimiento_1, pesos, pesos_char, pago_mc, pago_link, matricula):
        ''' funcion que genera el cuerpo del pdf para la cuota de sap'''
        
        '''
            parametros:
            ------------
            p: objeto pdf
            periodo: mes correspondiente al pago
            nombre: nommbre del asociado
            vencimiento_1: primer vencimiento
            pesos: valor de la cuota en numeros
            pesos_char: valor de la cuota en letras
            pago_mc: codigo de pago mis cuentas
            pago_link: codigo link

            return:
            ------------
            p: objeto pdf con la cabecera
        '''
        

        p.setFont('Helvetica', 14)
        p.setFillColor(red)
        p.setStrokeColor(red)  
        p.roundRect(inicio, 704, ancho, 26, 4, stroke=1, fill=0)
        p.drawString(25, 710, 'ASOCIADO:')
        p.setFillColor(black)
        p.drawString(110, 710, nombre)

        p.setFillColor(red)
        p.drawString(430, 710, 'MATRICULA:')

        p.setFillColor(black)
        p.drawString(520, 710, str(matricula))

        p.roundRect(inicio, 678, ancho, 26, 4, stroke=1, fill=0)
        p.rect(100, 678, 70, 26)
        p.rect(285, 678, 80, 26)
        p.rect(365, 678, 80, 26)
        p.setFillColor(red)
        p.drawString(25, 685, 'PERIODO:')
        p.setFillColor(black)
        p.drawString(110, 685, periodo)
        p.setFillColor(red)
        p.drawString(178, 685, 'VENCIMIENTO:')
        p.setFillColor(black)
        p.drawString(290, 685, str(vencimiento_1))
        p.setFillColor(red)
        p.drawString(370, 685, 'IMPORTE:')
        p.setFillColor(black)
        p.drawString(450, 685, str(pesos))
        p.roundRect(inicio, 652, ancho, 26, 4, stroke=1, fill=0)
        p.setFillColor(red)
        p.drawString(25, 660, 'SON PESOS:')
        p.setFillColor(black)
        p.drawString(120, 660, pesos_char)

        p.setFillColor(red)
        p.setFont('Helvetica', 9)
        p.drawString(25, 635, 'ESTIMADO PROFESIONAL: SI UD. ABONO LA CUOTA A VALOR ACTUALIZADO, POR FAVOR NO ABONE ESTA CUOTA AJUSTE.')
        p.roundRect(inicio, 626, ancho, 26, 4, stroke=1, fill=0)
   
        return p

    def cuerpo_sap_ajuste(self, p, nombre, periodo, vencimiento_1, pesos, pesos_char, pago_mc, pago_link, matricula):
        ''' funcion que genera el cuerpo del pdf para la cuota de sap'''
        
        '''
            parametros:
            ------------
            p: objeto pdf
            periodo: mes correspondiente al pago
            nombre: nommbre del asociado
            vencimiento_1: primer vencimiento
            pesos: valor de la cuota en numeros
            pesos_char: valor de la cuota en letras
            pago_mc: codigo de pago mis cuentas
            pago_link: codigo link

            return:
            ------------
            p: objeto pdf con la cabecera
        '''
        

        p.setFont('Helvetica', 14)
        p.setFillColor(blue)
        p.setStrokeColor(blue)  
        p.roundRect(inicio, 704, ancho, 26, 4, stroke=1, fill=0)
        p.drawString(25, 710, 'ASOCIADO:')
        p.setFillColor(black)
        p.drawString(110, 710, nombre)

        p.setFillColor(blue)
        p.drawString(430, 710, 'MATRICULA:')

        p.setFillColor(black)
        p.drawString(520, 710, str(matricula))

        p.roundRect(inicio, 678, ancho, 26, 4, stroke=1, fill=0)
        p.rect(100, 678, 70, 26)
        p.rect(285, 678, 80, 26)
        p.rect(365, 678, 80, 26)
        p.setFillColor(blue)
        p.drawString(25, 685, 'PERIODO:')
        p.setFillColor(black)
        p.drawString(110, 685, periodo)
        p.setFillColor(blue)
        p.drawString(178, 685, 'VENCIMIENTO:')
        p.setFillColor(black)
        p.drawString(290, 685, str(vencimiento_1))
        p.setFillColor(blue)
        p.drawString(370, 685, 'IMPORTE:')
        p.setFillColor(black)
        p.drawString(450, 685, str(pesos))
        p.roundRect(inicio, 652, ancho, 26, 4, stroke=1, fill=0)
        p.setFillColor(blue)
        p.drawString(25, 660, 'SON PESOS:')
        p.setFillColor(black)
        p.drawString(120, 660, pesos_char)

        p.setFillColor(blue)
        p.setFont('Helvetica', 9)
        p.drawString(25, 635, 'ESTIMADO PROFESIONAL: SI UD. ABONO LA CUOTA A VALOR ACTUALIZADO, POR FAVOR NO ABONE ESTA CUOTA AJUSTE.')
        p.roundRect(inicio, 626, ancho, 26, 4, stroke=1, fill=0)
   
        return p
    def codigo_de_barras(self, p, cod_barras):
        ''' funcion que genera el codigo de barras del pdf para la cuotas de colegiacion y sap'''
        
        '''
            parametros:
            ------------
            p: objeto pdf
            cod_barras: numero que genera el codigo de barras

            return:
            ------------
            p: objeto pdf con la cabecera
		'''
		
        barcode_value = cod_barras.encode('ascii')
        #code128_ = barcode.get_barcode_class('code128')

        #code = code128_(u'5901234123457')

        #barcode_value = 'codigo'
        #barcode_value2 = code128.Code128(barcode_value)
        #print(barcode_value2.validate())
        #b3 = barcode_value2.encode()
        barcode = createBarcodeDrawing('Codabar', value=cod_barras, barHeight=10*mm, barWidth=0.25*mm, humanReadable=False)
        
        #barcode = code128.Code128(cod_barras, barHeight=.9*inch,barWidth = 1.2) 

        #barcode = barcode_value
        
        d = Drawing(50, 10)
        d.add(barcode)
        renderPDF.draw(d, p, 168, 580)
        p.setFont('Helvetica', 10)
        p.drawString(208, 566, cod_barras)
        
        return p