# -*- coding: utf-8 -*-

import base64
import calendar

from logging import getLogger
from odoo import http, _
from odoo.exceptions import UserError
from odoo.http import request
from datetime import datetime, timedelta

from odoo.addons.website_portal.controllers.main import website_account

_logger = getLogger(__name__)


class WebsitePagos(website_account):

    @http.route('/my/pagos', type='http', auth='user', website=True)
    def pagos(self, **kw):
        values = self._prepare_portal_layout_values()
        contribuyente = request.env.user.partner_id
        pagos = request.env['sgt_pagos'].sudo().search([('partner_id', '=', contribuyente.id)])

        values.update({
            'contribuyente': contribuyente,
            'pagos': pagos,
        })

        return request.render("kyb_sgt_website_pagos.portal_pagos", values)

    @http.route(['/my/pago/new', '/my/pago/<int:pago_id>'], type='http', auth='user', website=True)
    def pagar(self, pago_id=None, alert=None, redirect=None, **post):
        values = {}
        contribuyente = request.env.user.partner_id
        cuentas = request.env['sgt_cuentas'].sudo().search([('partner_id', '=', contribuyente.id)])
        movimientos = request.env['sgt_movimientos'].sudo().search([('tipo_movimiento', '=', 'debito')])
        if pago_id:
            pago = request.env['sgt_pagos'].sudo().browse([pago_id])
            # if not pago.partner_id == contribuyente:
            #     return request.render("website.403")
        else:
            pago = request.env['sgt_pagos'].sudo()

        if post:
            values.update(post)
            values.update(
                {'partner_id': contribuyente.id,
                 'fecha_actual': datetime.today(),
                 })
            if pago_id:
                _logger.info('\n\n\n POST{} \n\n'.format(post))
                _logger.info('\n\n\n {} \n\n'.format('PASOOOOO'))
                values.update(post)
                pago.write(values)
            else:
                p_id = pago.create(values)
            if redirect:
                return request.redirect(redirect)
            elif pago_id:
                return request.redirect('/my/pagos')
            else:
                return request.redirect('/my/pago/{}'.format(p_id.id))

        values.update({
            'contribuyente': contribuyente,
            'pago': pago,
            'pago_id': pago_id,
            'cuentas': cuentas,
            'movimientos': movimientos,
            'alert': alert,
        })

        return request.render("kyb_sgt_website_pagos.pagar", values)

    @http.route(['/my/registro_pago/new', '/my/registro_pago/<int:ingreso_id>'], type='http', auth='user', website=True)
    def registro_pago(self, ingreso_id=None, pago_id=None, redirect=None, **post):
        values = {}
        contribuyente = request.env.user.partner_id
        bancos = request.env['sgt_bancos'].sudo().search([])
        pago = request.env['sgt_pagos'].sudo().browse(int(pago_id))
        if ingreso_id:
            ingreso = request.env['sgt_ingresos_pagos'].sudo().browse([ingreso_id])
            # if not pago.partner_id == contribuyente:
            #     return request.render("website.403")
        else:
            ingreso = request.env['sgt_ingresos_pagos'].sudo()

        if post:
            values.update(post)
            values.update(
                {'pagos_id': pago.id,
                 })
            if ingreso_id:
                _logger.info('\n\n\n POST{} \n\n'.format(post))
                _logger.info('\n\n\n {} \n\n'.format('PASOOOOO'))
                values.update(post)
                ingreso.write(values)
            else:
                # ingreso.create(values)
                if post['comprobante']:
                    _logger.info('\n\n\n POST {} \n\n\n'.format(pago))
                    datas = post.get('comprobante').stream.getvalue()
                    values.update({'comprobante': datas.encode('base64')})
                pago.write({'ingresos_pagos_ids': [(0, 0, values)]})
            if redirect:
                return request.redirect(redirect)
            # elif pago_id:
            #     return request.redirect('/my/pagos')
            else:
                return request.redirect('/my/pago/{}'.format(pago_id))

        values.update({
            'contribuyente': contribuyente,
            'ingreso': ingreso,
            'ingreso_id': ingreso_id,
            'pago_id': pago_id,
            'bancos': bancos,
        })

        return request.render("kyb_sgt_website_pagos.registro_pago", values)

    @http.route(['/validar_pago/<int:pago_id>'], type='http', auth='user', website=True)
    def pago_validado(self, pago_id=None):
        user = request.env.user.partner_id
        pago = request.env['sgt_pagos'].sudo().browse([pago_id])
        if pago.ingresos_pagos_ids:
            if pago.monto_movimiento == pago.total_pago and pago.movimiento_id.pagado is not True:
                for i in pago.ingresos_pagos_ids:
                    if not i.comprobante:
                        return request.redirect('/my/pago/{}?alert=El Campo de los Adjuntos esta Vacío'.format(pago_id))
                        # raise UserError(_('El Campo de los Adjuntos esta Vacío'))
                    else:
                        i.validado_contribuyente = True
                if pago.movimiento_id.concepto_movimiento_id.codigo == '100':
                    request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                  'cuenta_id': pago.cuenta_id.id,
                                                                  'estatus': 'borrador',
                                                                  'concepto_movimiento_id': pago.concepto_movimiento_id.id,
                                                                  'periodo_id': pago.movimiento_id.declaracion_id.periodo_id.id,
                                                                  'monto_movimiento': pago.total_pago,
                                                                  'declaracion_id': pago.movimiento_id.declaracion_id.id,
                                                                  'tipo_movimiento': 'credito'})
                    pago.estatus = 'por_conciliar'
                    if pago.movimiento_id.concepto_movimiento_id.codigo == '100' and pago.fecha_actual > pago.movimiento_id.periodo_id.tope:
                        date1 = datetime.strptime(pago.movimiento_id.periodo_id.tope, "%Y-%m-%d")
                        date2 = datetime.strptime(pago.fecha_actual, "%Y-%m-%d")
                        diferencia_dias = date2 - date1
                        interes_mora = ((pago.movimiento_id.monto_movimiento * (1.2 * pago.tasa_bcv_id.monto)) * diferencia_dias.days) / 365
                        request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                      'cuenta_id': pago.cuenta_id.id,
                                                                      'estatus': 'cargo',
                                                                      'concepto_movimiento_id': 2,
                                                                      'periodo_id': pago.movimiento_id.declaracion_id.periodo_id.id,
                                                                      'monto_movimiento': interes_mora,
                                                                      'declaracion_id': pago.movimiento_id.declaracion_id.id,
                                                                      'tipo_movimiento': 'debito'})
                        if diferencia_dias < timedelta(days=365):
                            interes = (pago.movimiento_id.monto_movimiento * 0.28) * diferencia_dias.days
                            if interes >= pago.movimiento_id.monto_movimiento:
                                request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                              'cuenta_id': pago.cuenta_id.id,
                                                                              'estatus': 'cargo',
                                                                              'concepto_movimiento_id': 4,
                                                                              'periodo_id': pago.movimiento_id.declaracion_id.periodo_id.id,
                                                                              'monto_movimiento': pago.movimiento_id.monto_movimiento,
                                                                              'declaracion_id': pago.movimiento_id.declaracion_id.id,
                                                                              'tipo_movimiento': 'debito'})
                            else:
                                request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                              'cuenta_id': pago.cuenta_id.id,
                                                                              'estatus': 'cargo',
                                                                              'concepto_movimiento_id': 4,
                                                                              'periodo_id': pago.movimiento_id.declaracion_id.periodo_id.id,
                                                                              'monto_movimiento': interes,
                                                                              'declaracion_id': pago.movimiento_id.declaracion_id.id,
                                                                              'tipo_movimiento': 'debito'})
                        elif diferencia_dias > timedelta(days=365) and diferencia_dias < timedelta(days=730):
                            interes = ((pago.movimiento_id.monto_movimiento * 150) / 100)
                            request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                          'cuenta_id': pago.cuenta_id.id,
                                                                          'estatus': 'cargo',
                                                                          'concepto_movimiento_id': 4,
                                                                          'periodo_id': pago.movimiento_id.declaracion_id.periodo_id.id,
                                                                          'monto_movimiento': interes,
                                                                          'declaracion_id': pago.movimiento_id.declaracion_id.id,
                                                                          'tipo_movimiento': 'debito'})
                        else:
                            interes = ((pago.movimiento_id.monto_movimiento * 300) / 100)
                            request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                          'cuenta_id': pago.cuenta_id.id,
                                                                          'estatus': 'cargo',
                                                                          'concepto_movimiento_id': 4,
                                                                          'periodo_id': pago.movimiento_id.declaracion_id.periodo_id.id,
                                                                          'monto_movimiento': interes,
                                                                          'declaracion_id': pago.movimiento_id.declaracion_id.id,
                                                                          'tipo_movimiento': 'debito'})
                elif pago.movimiento_id.concepto_movimiento_id.codigo == '300':
                    request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                  'cuenta_id': pago.cuenta_id.id,
                                                                  'estatus': 'borrador',
                                                                  'concepto_movimiento_id': pago.concepto_movimiento_id.id,
                                                                  'periodo_id': pago.movimiento_id.periodo_id.id,
                                                                  'monto_movimiento': pago.total_pago,
                                                                  'movimiento_id': pago.movimiento_id.id,
                                                                  'tipo_movimiento': 'credito'})
                    pago.estatus = 'por_conciliar'
                elif pago.movimiento_id.concepto_movimiento_id.codigo == '200':
                    request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                  'cuenta_id': pago.cuenta_id.id,
                                                                  'estatus': 'borrador',
                                                                  'concepto_movimiento_id': pago.concepto_movimiento_id.id,
                                                                  'periodo_id': pago.movimiento_id.periodo_id.id,
                                                                  'monto_movimiento': pago.total_pago,
                                                                  'movimiento_id': pago.movimiento_id.id,
                                                                  'tipo_movimiento': 'credito'})
                    pago.estatus = 'por_conciliar'
                elif pago.movimiento_id.concepto_movimiento_id.codigo == '310':
                    request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                  'cuenta_id': pago.cuenta_id.id,
                                                                  'estatus': 'borrador',
                                                                  'concepto_movimiento_id': pago.concepto_movimiento_id.id,
                                                                  'periodo_id': pago.movimiento_id.periodo_id.id,
                                                                  'monto_movimiento': pago.total_pago,
                                                                  'movimiento_id': pago.movimiento_id.id,
                                                                  'tipo_movimiento': 'credito'})
                    pago.estatus = 'por_conciliar'
            else:
                return request.redirect('/my/pago/{}?alert=Los montos de los pagos no son igual al monto del movimiento o el movimiento ya fue pagado.'.format(pago_id))
                # raise UserError(_('Los Montos de los Pagos no son Igual al Monto del Movimiento o el movimiento ya fue pagado.'))
        else:
            return request.redirect('/my/pago/{}?alert=Debe añadir por al menos un pago para poder ser validado.'.format(pago_id))
            # raise UserError(_('El Campo de Registros de los Pagos se encuentra Vacío.'))
        return request.redirect('/my/pago/{}'.format(pago_id))
