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

import base64
import calendar

from logging import getLogger
from odoo import http
from odoo.http import request
from datetime import datetime, timedelta

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

_logger = getLogger(__name__)


class WebsiteDeclaracion(website_account):

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

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

        return request.render("kyb_sgt_website_declaracion.portal_declaracion", values)

    @http.route(['/my/declaracion/new', '/my/declaracion/<int:declaracion_id>'], type='http', auth='user', website=True)
    def declaracion_jurada(self, declaracion_id=None, alert=False, redirect=None, **post):
        values = {}
        contribuyente = request.env.user.partner_id
        cuentas = request.env['sgt_cuentas'].sudo().search([('partner_id', '=', contribuyente.id)])
        periodos = request.env['sgt_movimientos_periodos'].sudo().search([])
        if declaracion_id:
            declaracion = request.env['sgt_declaraciones'].sudo().browse([declaracion_id])
            if not declaracion.partner_id == contribuyente:
                return request.render("website.403")
        else:
            declaracion = request.env['sgt_declaraciones'].sudo()
        if post:
            values.update(post)
            values.update(
                {'partner_id': contribuyente.id,
                 'fecha_actual': datetime.today(),
                 'periodo_id': int(post.get('periodo_id')),
                 'cuenta_id': int(post.get('cuenta_id')),
                 })
            if declaracion_id:
                _logger.info('\n\n\n POST{} \n\n'.format(post))
                _logger.info('\n\n\n {} \n\n'.format('PASOOOOO'))
                values.update(post)
                declaracion.write(values)
            else:
                d_id = declaracion.create(values)
                self.declarar_ingresos(d_id)
            if redirect:
                return request.redirect(redirect)
            elif declaracion_id:
                return request.redirect('/my/declaracion')
            else:
                return request.redirect('/my/declaracion/{}'.format(d_id.id))

        values.update({
            'contribuyente': contribuyente,
            'declaracion': declaracion,
            'declaracion_id': declaracion_id,
            'cuentas': cuentas,
            'periodos': periodos,
            'alert': alert,
        })

        return request.render("kyb_sgt_website_declaracion.declaracion_jurada", values)

    def declarar_ingresos(self, declaracion):
        date1 = datetime.strptime(declaracion.periodo_id.desde, "%Y-%m-%d")
        date2 = datetime.strptime(declaracion.periodo_id.hasta, "%Y-%m-%d")
        months_str = calendar.month_name
        while date1 < date2:
            month = date1.month
            year = date1.year
            month_str = months_str[month].title()
            self.get_ingresos(declaracion, month_str, str(year))
            next_month = month + 1 if month != 12 else 1
            next_year = year + 1 if next_month == 1 else year
            date1 = date1.replace(month=next_month, year=next_year)
        declaracion.write({'generado': True})

    def get_ingresos(self, declaracion, mes, anio):
        declaracion.write({'ingresos_mensuales_ids': [(0, 0, {'declaracion_id': declaracion.id,
                                                              'anio': anio,
                                                              'mes': mes,
                                                              'monto': None,
                                                              'comprobante': None,
                                                              'verificacion_contribuyente': False,
                                                              'verificacion_analista': False})]})

    @http.route('/my/ingreso/<int:ingreso_id>', type='http', auth='user', website=True)
    def verificar_ingresos(self, ingreso_id=None, declaracion_id=None, redirect=None, **post):
        ingreso = request.env['sgt_ingresos_mensuales'].sudo().browse([ingreso_id])
        if ingreso.declaracion_id.id == declaracion_id:
            return request.render("website.403")
        values = dict()
        _logger.info('\n\n\n DEC_id{} \n\n\n'.format(declaracion_id))
        _logger.info('\n\n\n Ingreso{} \n\n\n'.format(ingreso.declaracion_id.id))
        if post:
            values.update(post)
            if 'comprobante' in post:
                _logger.info('\n\n\n POST {} \n\n\n'.format(post))
                datas = post.get('comprobante').stream.getvalue()
                values.update({'comprobante': datas.encode('base64')})
            ingreso.write(values)
            if redirect:
                return request.redirect(redirect)
            return request.redirect('/my/declaracion/{}'.format(declaracion_id))
        values.update({
            'ingreso': ingreso,
            'ingreso_id': ingreso_id,
            'declaracion_id': declaracion_id,
        })

        return request.render("kyb_sgt_website_declaracion.verificar_ingresos", values)

    @http.route(['/validar/<int:declaracion_id>'], type='http', auth='user', website=True)
    def declaracion_validada(self, declaracion_id):
        user = request.env.user.partner_id
        declaracion = request.env['sgt_declaraciones'].sudo().browse([declaracion_id])
        if declaracion.estatus == 'Borrador':
            for i in declaracion.ingresos_mensuales_ids:
                if i.monto > 0 and i.comprobante:
                    i.verificacion_contribuyente = True
                else:
                    return request.redirect('/my/declaracion/{}?alert=True'.format(declaracion_id))
                #     raise UserError(_('Los montos se encuentran en 0,00 o falta comprobante.'))
            declaracion.write({'total_contribucion': declaracion.contribucion_id.monto * declaracion.total_ingreso / 100})

            request.env['sgt_liquidacion'].sudo().create({'total_ingreso': declaracion.total_ingreso,
                                                          'declaracion_id': declaracion.id})
            request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                          'cuenta_id': declaracion.cuenta_id.id,
                                                          'estatus': 'cargo',
                                                          'concepto_movimiento_id': 1,
                                                          'periodo_id': declaracion.periodo_id.id,
                                                          'monto_movimiento': declaracion.total_contribucion,
                                                          'tipo_movimiento': 'debito',
                                                          'declaracion_id': declaracion.id})
            if declaracion.fecha_actual >= declaracion.periodo_id.tope:
                date1 = datetime.strptime(declaracion.periodo_id.tope, "%Y-%m-%d")
                date2 = datetime.strptime(declaracion.fecha_actual, "%Y-%m-%d")
                diferencia_dias = date2 - date1
                if diferencia_dias > timedelta(days=365):
                    request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                  'cuenta_id': declaracion.cuenta_id.id,
                                                                  'estatus': 'cargo',
                                                                  'concepto_movimiento_id': 3,
                                                                  'periodo_id': declaracion.periodo_id.id,
                                                                  'monto_movimiento': 150 * declaracion.unidad_tributaria_id.monto,
                                                                  'tipo_movimiento': 'debito',
                                                                  'declaracion_id': declaracion.id})
                else:
                    request.env['sgt_movimientos'].sudo().create({'partner_id': user.id,
                                                                  'cuenta_id': declaracion.cuenta_id.id,
                                                                  'estatus': 'cargo',
                                                                  'concepto_movimiento_id': 3,
                                                                  'periodo_id': declaracion.periodo_id.id,
                                                                  'monto_movimiento': 100 * declaracion.unidad_tributaria_id.monto,
                                                                  'tipo_movimiento': 'debito',
                                                                  'declararlaracion_id': declaracion.id})
            declaracion.estatus = 'Validado'
            return request.redirect('/my/declaracion/{}'.format(declaracion_id))
