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

import json
import base64

from odoo import http, _, tools
from odoo.http import request
from odoo.addons.auth_signup.controllers.main import AuthSignupHome
from odoo.addons.website_form.controllers.main import WebsiteForm
from odoo import exceptions 

from logging import getLogger
_logger = getLogger(__name__)




# class WebsiteSolicitudForm(WebsiteForm):


#     @http.route('/website_form/sgt_nuevo_ingreso', type='http', auth="public", methods=['POST'], website=True)
#     def website_form_saleorder(self, **kwargs):
#         model_record = request.env.ref('kyb_sgt_ruc.model_sgt_nuevo_ingreso')
#         try:
#             data = self.extract_data(model_record, kwargs)
#         except ValidationError, e:
#             return json.dumps({'error_fields': e.args[0]})

#         solicitud = request.env['sgt_nuevo_ingreso'].sudo()
#         # order = request.website.sale_get_order()
#         if data['record']:
#             solicitud.write(data['record'])

#         if data['custom']:
#             values = {
#                 'body': nl2br(data['custom']),
#                 'model': 'sgt_nuevo_ingreso',
#                 'message_type': 'comment',
#                 'no_auto_thread': False,
#                 'res_id': solicitud.id,
#             }
#             request.env['mail.message'].sudo().create(values)

#         if data['attachments']:
#             self.insert_attachment(model_record, solicitud.id, data['attachments'])

#         return json.dumps({'id': solicitud.id})


class AuthSignupHomeExtend(AuthSignupHome):

    @http.route('/web/signup', type='http', auth='public', website=True)
    def web_auth_signup(self, *args, **kw):
        response = super(AuthSignupHomeExtend, self).web_auth_signup(*args, **kw)
        solicitud = request.env['sgt_nuevo_ingreso'].sudo()
        values = {}
        country = request.env['res.country'].sudo().search([])
        state = request.env['res.country.state'].sudo().search([])
        municipalities = request.env['res.country.state.municipality'].sudo().search([])
        parishes = request.env['res.country.state.municipality.parish'].sudo().search([])
        ffiscales = request.env['sgt_figura_fiscal'].sudo().search([])
        values.update({
            'solicitud': solicitud,
            'municipalities': municipalities,
            'parishes': parishes,
            'ffiscales': ffiscales,
            'country': country,
            'state': state})
        solicitud.sudo().create(kw)
        _logger.info('\n\n\n POST: \n\n\n'.format(kw))
        # return request.render("auth_signup.auth_signup.fields", values)
        response.qcontext.update(values)
        return response


class SolicitudRegistro(http.Controller):

    @http.route('/web/process', type='http', auth='public', website=True)
    def web_process(self, **kw):
        return request.render("kyb_portal_web.solicitud_procesada")

    NATURAL = ['fiscal_figure_id', 'cedula', 'primer_nombre', 'primer_apellido', 'email', 'telefono_movil', 'genero',
               'state_id', 'municipality_id', 'parish_id', 'direccion', 'adjunto_uno']

    JURIDICO = ['fiscal_figure_id', 'rif', 'razon_social', 'email', 'telefono_movil', 'state_id', 'municipality_id',
                'parish_id', 'direccion', 'adjunto_uno']

    @http.route(['/web/registro', '/web/registro/natural/<int:tipo_ruc>', '/web/registro/juridico/<int:tipo_ruc>'], type='http', auth='public', website=True)
    def web_registro(self, tipo_ruc=0, redirect=None, **post):
        values = {
            'error': {},
            'error_message': []
        }        
        _logger.info('\n\n\n {} \n\n\n'.format(tipo_ruc))
        solicitud = request.env['sgt_nuevo_ingreso'].sudo()
        states = request.env['res.country.state'].sudo().search([('country_id', '=', 240)])
        municipalities = request.env['res.country.state.municipality'].sudo().search([])
        parishes = request.env['res.country.state.municipality.parish'].sudo().search([])
        adjuntos = ['adjunto_uno', 'adjunto_dos',
                    'adjunto_tres', 'adjunto_cuatro',
                    'adjunto_cinco']
        # ffiscales = request.env['sgt_figura_fiscal'].sudo().search([])
        if tipo_ruc == 1:
            ffiscales = request.env['sgt_figura_fiscal'].sudo().search([('tipo', '=', 'person')])
            # raise exceptions.Warning('Warning message') 
# raise exceptions.ValidationError('Not valid message') 
        else:
            ffiscales = request.env['sgt_figura_fiscal'].sudo().search([('tipo', '=', 'company')])
        _logger.info('\n\n\n\n POST{} \n\n\n'.format(post))
        if post:
            error, error_message = self.details_form_validate(post, tipo_ruc)
            values.update({'error': error, 'error_message': error_message})
            values.update(post)

            if not error:
                # values = {key: post[key] for key in self.NATURAL}
                for i in adjuntos:
                    if tipo_ruc == 1:
                            values.update({key: post[key] for key in self.NATURAL if key in post and not i})
                            # warning = {
                            # 'title': _('Warning!'),
                            # 'message': _('Hola como estas'),
                            # }
                            # return {'warning': warning}
                    else:
                        values.update({key: post[key] for key in self.JURIDICO if key in post and not i})

                # values.update({key: post[key] for key in self.OPTIONAL_BILLING_FIELDS if key in post and not 'image'})

                ffiscal_id = int(post.get('fiscal_figure_id'))
                post.update({'fiscal_figure_id': ffiscal_id})
                for i in adjuntos:
                    str(i)
                    _logger.info('\n\n\n {} \n\n\n'.format(i))
                    if i in post:
                        data = post.get(i).stream.getvalue()
                        _logger.info('\n\n\n {} \n\n\n'.format(data))
                        post.update({i: data.encode('base64')})
                if tipo_ruc == 1:
                    post.update({'tipo_ruc': 'person'})
                    solicitud.create(post)
                elif tipo_ruc == 2:
                    post.update({'tipo_ruc': 'company'})
                    solicitud.create(post)
                if redirect:
                    return request.redirect(redirect)
                return request.redirect('/web/process') 
        values.update({
            'solicitud': solicitud,
            'tipo_ruc': tipo_ruc,
            'municipalities': municipalities, 
            'parishes': parishes, 
            'ffiscales': ffiscales,
            # 'country': country, 
            'states': states,
            'redirect': redirect,})
        if tipo_ruc == 0:
            return request.render("kyb_portal_web.tipo_contribuyente", values)
        elif tipo_ruc == 1:
            return request.render("kyb_portal_web.kyb_registro_natural", values)
        elif tipo_ruc == 2:
            return request.render("kyb_portal_web.kyb_registro_juridico", values)

    def write_adjunto(self, **post):
        vals = {}
        adjuntos = ['adjunto_uno','adjunto_dos',
                    'adjunto_tres','adjunto_cuatro',
                    'adjunto_cinco']
        for i in adjuntos:
            if post[i]:
                data = post.get(i).stream.getvalues()
                return vals.update({i:data.encode('base64')})


    def details_form_validate(self, data, tipo_ruc=0):
            partners = request.env['res.partner'].sudo().search([])
            ingresos = request.env['sgt_nuevo_ingreso'].sudo().search([])
            error = dict()
            error_message = []
            _logger.info('\n\n\n mostrar{} \n\n\n'.format(data))


            # Validation
            if tipo_ruc == 1:
                for field_name in self.NATURAL:
                    if not data.get(field_name):
                        error[field_name] = 'missing'
            elif tipo_ruc == 2:
                for field_name in self.JURIDICO:
                    if not data.get(field_name):
                        error[field_name] = 'missing'

            # email validation
            if data.get('email') and not tools.single_email_re.match(data.get('email')):
                error["email"] = 'error'
                error_message.append(_('¡Email inválido! Por favor, introduce una dirección de correo electrónico válida.'))

            # vat validation
            if data.get("vat") and hasattr(request.env["res.partner"], "check_vat"):
                if data.get("country_id"):
                    data["vat"] = request.env["res.partner"].fix_eu_vat_number(int(data.get("country_id")), data.get("vat"))
                if request.website.company_id.sudo().vat_check_vies:
                    # force full VIES online check
                    check_func = request.env["res.partner"].vies_vat_check
                else:
                    # quick and partial off-line checksum validation
                    check_func = request.env["res.partner"].simple_vat_check
                vat_country, vat_number = request.env["res.partner"]._split_vat(data.get("vat"))
                if not check_func(vat_country, vat_number):  # simple_vat_check
                    error["vat"] = 'error'

            # error message for empty required fields
            if [err for err in error.values() if err == 'missing']:
                error_message.append(_('Algunos campos obligatorios están vacíos.'))

            # Diccionario de los fields que son solo dígitos
            vals_digit = {'cedula': 'Cedula',
                          'rif': 'Rif',
                          'phone': 'Telefono',
                          'telefono_movil': 'Telefono Movil', }
            # Diccionarion de los fields que son alfabéticos
            vals_string = {'primer_nombre': 'Primer Nombre',
                           'primer_apellido': 'Primer Apellido', }

            for key, val in vals_string.items():
                k = str(key)
                if data.get(k) and not data.get(k).isalpha():
                    error[k] = 'error'
                    error_message.append(_('{} debe contener solo valores alfabéticos'.format(val)))

            for key, val in vals_digit.items():
                k = str(key)
                if data.get(k) and not data.get(k).isdigit():
                    error[k] = 'error'
                    error_message.append(_('{} debe contener solo valores numéricos').format(val))

            if data.get('email'):
                for record in partners:
                    if data.get('email') == record.email:
                        error['email'] = 'error'
                        error_message.append(_('El correo electrónico que ingresó ya está registrado'))
                for record in ingresos:
                    if data.get('email') == record.email:
                        error['email'] = 'error'
                        error_message.append(_('El correo electrónico que ingresó ya está registrado'))

            if data.get('rif'):
                for record in partners:
                    if data.get('rif') == record.rif:
                        error['rif'] = 'error'
                        error_message.append(_('El rif ingresado ya está registrado'))
                for record in ingresos:
                    if data.get('rif') == record.rif:
                        error['rif'] = 'error'
                        error_message.append(_('El rif ingresado ya está registrado'))

            if data.get('cedula'):
                for record in partners:
                    if data.get('cedula') == record.cedula:
                        error['cedula'] = 'error'
                        error_message.append(_('La cédula ingresada ya está registrada'))
                for record in ingresos:
                    if data.get('cedula') == record.cedula:
                        error['cedula'] = 'error'
                        error_message.append(_('La cédula ingresada ya está registrada'))

            # if partner_id.is_contribuyente:
            #     if len(partner_id.sujeto_pasivo_ids) < 3:
            #             error['responsables'] = 'error'
            #             error_message.append(_('Debe registrar al menos 3 responsables'))

            # unknown = [k for k in data.iterkeys() if k not in self.MANDATORY_BILLING_FIELDS + self.OPTIONAL_BILLING_FIELDS]
            # if unknown:
            #     error['common'] = 'Unknown field'
            #     error_message.append("Unknown field '%s'" % ','.join(unknown))

            return error, error_message