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

import re

from datetime import datetime

from odoo import models, fields, api, _

from odoo.exceptions import ValidationError, UserError
from odoo.tools import ustr

from logging import getLogger
_logger = getLogger(__name__)

ls_solictud = [('solicitante', 'Solicitante'),
               ('contribuyente', 'Aportante'),
               ('devuelto', 'Devuelto')]

ls_genero = [('femenino', 'Femenino'),
             ('masculino', 'Masculino')]

ls_tipo_organizacion = [('publica', 'Pública'),
                        ('privada', 'Privada')]


class SgtFiguraFiscal(models.Model):
    _name = 'sgt_figura_fiscal'
    _rec_name = 'codigo'
    _sql_constraints = [('unique_codigo', 'UNIQUE(codigo)', 'Esta figura fiscal ya está registrada')]
    _order = 'denominacion'

    codigo = fields.Char(string='Código', size=4)
    denominacion = fields.Char(string='Denominación', size=80)
    tipo = fields.Selection([('person', 'Natural'), ('company', 'Jurídico')], string='Tipo')
    country_id = fields.Many2one('res.country', string='Country')


class SgtActividadEconomica(models.Model):
    _name = 'sgt_actividad_economica'
    _rec_name = 'denominacion'
    _sql_constraints = [('unique_denominacion', 'UNIQUE(denominacion)', 'Esta Actividad Económica Ya Está Registrada')]
    _order = 'denominacion'

    codigo = fields.Char(string='Código', size=4)
    denominacion = fields.Char(string='Denominación', size=80, required=True)

    @api.onchange('denominacion')
    def _onchange_denominacion(self):
        # Convertir la primera letra del string en mayuscula.
        if self.denominacion:
            self.denominacion = self.denominacion.title()


class SgtAnalistaVerificacion(models.Model):
    _name = 'sgt_analista_verificacion'
    _rec_name = 'create_uid'

    verificacion = fields.Boolean(string='Verificado')
    res_partner_id = fields.Many2one('res.partner', 'Aportante')
    observaciones = fields.Text('Observaciones')


class SgtNuevoIngreso(models.Model):
    _name = 'sgt_nuevo_ingreso'
    _rec_name = 'display_registro'
    _sql_constraints = [('unique_cedula', 'UNIQUE(cedula)', 'El número de cédula ya está registrado'),
                        ('unique_rif', 'UNIQUE(rif)', 'El número de rif ya está registrado')]

    tipo_ruc = fields.Selection([('person', 'Natural'), ('company', 'Jurídico')], string='Tipo de Contribuyente', default='person')
    tipo_organizacion = fields.Selection(ls_tipo_organizacion, string='Tipo de Organización', compute="verificar_tipo_organizacion", store=True)
    fiscal_figure_id = fields.Many2one('sgt_figura_fiscal', string='Figura Fiscal')
    cedula = fields.Char(string='Cédula', size=8)
    primer_nombre = fields.Char(string='Primer Nombre', size=35)
    primer_apellido = fields.Char(string='Primer Apellido', size=35)
    email = fields.Char(string='Correo Electrónico', size=35)
    telefono_movil = fields.Char(string='Teléfono Movil', size=35)
    razon_social = fields.Char(string='Razon Social', size=35)
    rif = fields.Char(string='R.I.F', size=10)
    country_id = fields.Many2one('res.country', default=lambda self: self.env['res.country'].search([('name', '=', 'Venezuela')]), string='Pais', readonly=True)
    state_id = fields.Many2one('res.country.state', string='Estado')
    municipality_id = fields.Many2one('res.country.state.municipality', string='Municipio')
    parish_id = fields.Many2one('res.country.state.municipality.parish', string='Parroquia')
    direccion = fields.Char(string='Dirección', size=80)
    estatus = fields.Selection(ls_solictud, string='Estatus', default='solicitante')
    genero = fields.Selection(ls_genero, string='Genero')
    display_registro = fields.Char(store=True)
    adjunto_uno = fields.Binary('Adjunto N°1')
    adjunto_dos = fields.Binary('Adjunto N°2')
    adjunto_tres = fields.Binary('Adjunto N°3')
    adjunto_cuatro = fields.Binary('Adjunto N°4')
    adjunto_cinco = fields.Binary('Adjunto N°5')
    observaciones = fields.Text('Observaciones')
    ced_rif = fields.Char('Cédula/R.I.F', readonly=True)

    @api.multi
    def crear_contribuyente(self):
        if self.adjunto_uno or self.adjunto_dos or self.adjunto_tres or self.adjunto_cuatro or self.adjunto_cinco:
            contribuyente = False
            for nuevo_ingreso in self:
                if self.tipo_ruc == 'person':
                    self.estatus = 'contribuyente'
                    contribuyente = self.env['res.partner'].create({'company_type': nuevo_ingreso.tipo_ruc,
                                                                    'name': nuevo_ingreso.primer_nombre + ' ' + nuevo_ingreso.primer_apellido,
                                                                    'first_name': nuevo_ingreso.primer_nombre,
                                                                    'first_last_name': nuevo_ingreso.primer_apellido,
                                                                    'cedula': nuevo_ingreso.cedula,
                                                                    'mobile': nuevo_ingreso.telefono_movil,
                                                                    'gender': nuevo_ingreso.genero,
                                                                    'email': nuevo_ingreso.email,
                                                                    'display_registro': ustr(nuevo_ingreso.fiscal_figure_id.codigo) + '-' + ustr(nuevo_ingreso.cedula),
                                                                    'state_id': nuevo_ingreso.state_id.id,
                                                                    'municipality_id': nuevo_ingreso.municipality_id.id,
                                                                    'parish_id': nuevo_ingreso.parish_id.id,
                                                                    'street': nuevo_ingreso.direccion,
                                                                    'adjunto_uno': nuevo_ingreso.adjunto_uno,
                                                                    'adjunto_dos': nuevo_ingreso.adjunto_dos,
                                                                    'adjunto_tres': nuevo_ingreso.adjunto_tres,
                                                                    'adjunto_cuatro': nuevo_ingreso.adjunto_cuatro,
                                                                    'adjunto_cinco': nuevo_ingreso.adjunto_cinco,
                                                                    'is_contribuyente': True,
                                                                    'tipo_organizacion': nuevo_ingreso.tipo_organizacion,
                                                                    'fiscal_figure_id': nuevo_ingreso.fiscal_figure_id.id})
                else:
                    self.estatus = 'contribuyente'
                    contribuyente = self.env['res.partner'].create({'company_type': nuevo_ingreso.tipo_ruc,
                                                                    'email': nuevo_ingreso.email,
                                                                    'name': ustr(nuevo_ingreso.razon_social),
                                                                    'is_company': True,
                                                                    'rif': nuevo_ingreso.rif,
                                                                    'display_registro': ustr(nuevo_ingreso.fiscal_figure_id.codigo) + '-' + ustr(nuevo_ingreso.rif),
                                                                    'state_id': nuevo_ingreso.state_id.id,
                                                                    'municipality_id': nuevo_ingreso.municipality_id.id,
                                                                    'parish_id': nuevo_ingreso.parish_id.id,
                                                                    'street': nuevo_ingreso.direccion,
                                                                    'phone': nuevo_ingreso.telefono_movil,
                                                                    'adjunto_uno': nuevo_ingreso.adjunto_uno,
                                                                    'adjunto_dos': nuevo_ingreso.adjunto_dos,
                                                                    'adjunto_tres': nuevo_ingreso.adjunto_tres,
                                                                    'adjunto_cuatro': nuevo_ingreso.adjunto_cuatro,
                                                                    'adjunto_cinco': nuevo_ingreso.adjunto_cinco,
                                                                    'is_contribuyente': True,
                                                                    'tipo_organizacion': nuevo_ingreso.tipo_organizacion,
                                                                    'fiscal_figure_id': nuevo_ingreso.fiscal_figure_id.id})
        else:
            raise UserError(_('El Campo de Adjuntos se encuentra Vacío.'))

    @api.model
    def create(self, values):
        if values.get('primer_nombre'):
            values.update({'primer_nombre': values.get('primer_nombre').title()})
        if values.get('primer_apellido'):
            values.update({'primer_apellido': values.get('primer_apellido').title()})
        if values.get('razon_social'):
            values.update({'razon_social': values.get('razon_social').title()})
        fiscal_figure = self.env['sgt_figura_fiscal'].browse(values.get('fiscal_figure_id'))
        if values.get('rif') and fiscal_figure:
            values.update({'display_registro': ustr(fiscal_figure.codigo) + '-' + ustr(values.get('rif'))})
        elif values.get('cedula') and fiscal_figure:
            values.update({'display_registro': ustr(fiscal_figure.codigo) + '-' + ustr(values.get('cedula'))})
        return super(SgtNuevoIngreso, self).create(values)

    @api.multi
    def write(self, vals):
        if vals.get('primer_nombre'):
            vals.update({'primer_nombre': vals.get('primer_nombre').title()})
        if vals.get('primer_apellido'):
            vals.update({'primer_apellido': vals.get('primer_apellido').title()})
        if vals.get('razon_social'):
            vals.update({'razon_social': vals.get('razon_social').title()})
        fiscal_figure = self.env['sgt_figura_fiscal'].search([('id', '=', vals.get('fiscal_figure_id'))])
        if vals.get('rif') and vals.get('fiscal_figure_id'):
            vals.update({'display_registro': ustr(fiscal_figure.codigo) + '-' + ustr(vals.get('rif'))})
        elif vals.get('cedula') and vals.get('fiscal_figure_id'):
            vals.update({'display_registro': ustr(fiscal_figure.codigo) + '-' + ustr(vals.get('cedula'))})
        return super(SgtNuevoIngreso, self).write(vals)

    @api.multi
    def devolver_solicitud(self):
        if self.observaciones and self.email:
            template = self.env.ref('kyb_sgt_ruc.mail_template_devolucion_sgt')
            if template:
                template.with_context(dbname=self._cr.dbname).send_mail(self.id, force_send=True)
            else:
                raise UserError(_('Template no definido.'))
            if self.cedula:
                self.ced_rif = self.fiscal_figure_id.codigo + ustr(self.cedula)
                self.cedula = int(self.cedula) + 99999999 + int((str(datetime.now()))[8:10]) + int((str(datetime.now()))[5:7])
            else:
                self.ced_rif = self.fiscal_figure_id.codigo + ustr(self.rif)
                self.rif = int(self.rif) + 99999999 + int((str(datetime.now()))[8:10]) + int((str(datetime.now()))[5:7])
            self.estatus = 'devuelto'
        else:
            raise UserError(_('El Campo de observaciones se encuentra Vacío.'))

    @api.constrains('cedula', 'rif')
    def numero_identificacion(self):
        # Validar que el número de cédula tenga solo valores numéricos
        if self.cedula:
            if not self.cedula.isdigit():
                raise ValidationError("El número de cédula debe contener solo valores númericos")
        elif self.rif:
            if not self.rif.isdigit():
                raise ValidationError("El número de rif debe contener solo valores númericos")

    @api.constrains('email')
    def formato_email(self):
        # Validar que el email tenga un arroba.
        if self.email:
            if not re.match('^[(a-z0-9\_\-\.)]+@[(a-z0-9\_\-\.)]+\.[(a-z)]{2,15}$', self.email.lower()):
                raise ValidationError(('Formato de email invalido \n %s \n La forma correcta es: ejemplo@dominio.com' % (self.email).encode('utf-8')))

    @api.constrains('telefono_movil')
    def numero_telefonico(self):
        # Validar que el número telefónico tenga solo valores numéricos.
        if self.telefono_movil:
            if not self.telefono_movil.isdigit():
                raise ValidationError("El número de telefóno debe contener solo valores numéricos")

    @api.constrains('primer_nombre', 'primer_apellido')
    def nombre_apellido(self):
        # Validar que el Primer Nombre y Primer Apellido solo sean valores alfabeticos
        if self.primer_nombre:
            if not self.primer_nombre.isalpha():
                raise ValidationError("El primer nombre debe contener solo valores alfabeticos")
        if self.primer_apellido:
            if not self.primer_apellido.isalpha():
                raise ValidationError("El primer apellido debe contener solo valores alfabeticos")

    @api.onchange('tipo_ruc')
    def _onchange_limpiar_company(self):
        self.fiscal_figure_id = ''

    @api.onchange('state_id')
    def _onchange_limpiar_state(self):
        self.municipality_id = ''
        self.parish_id = ''

    @api.onchange('municipality_id')
    def _onchange_limpiar_municipality(self):
        self.parish_id = ''

    @api.multi
    @api.depends('fiscal_figure_id')
    def verificar_tipo_organizacion(self):
        if self.fiscal_figure_id.codigo == 'J':
            self.tipo_organizacion = 'privada'
        elif self.fiscal_figure_id.codigo == 'G' or self.fiscal_figure_id.codigo == 'C':
            self.tipo_organizacion = 'publica'
        else:
            self.tipo_organizacion = 'privada'
