# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from odoo import api, fields, models, _
from odoo.exceptions import UserError


class PrivacyLog(models.Model):
    _name = 'privacy.log'
    _description = 'Privacy Log'
    _rec_name = 'user_id'

    date = fields.Datetime(default=fields.Datetime.now, required=True)
    anonymized_name = fields.Char(required=True)
    anonymized_email = fields.Char(required=True)
    user_id = fields.Many2one(
        'res.users', string="Handled By", required=True,
        default=lambda self: self.env.user)
    execution_details = fields.Text()
    records_description = fields.Text(string="Found Records")
    additional_note = fields.Text()

    @api.model_create_multi
    def create(self, vals_list):
        for vals in vals_list:
            vals['anonymized_name'] = self._anonymize_name(vals['anonymized_name'])
            vals['anonymized_email'] = self._anonymize_email(vals['anonymized_email'])
        return super().create(vals_list)

    def _anonymize_name(self, label):
        if not label:
            return ''
        if '@' in label:
            return self._anonymize_email(label)
        return ' '.join(e[0] + '*' * (len(e) - 1) for e in label.split(' ') if e)

    def _anonymize_email(self, label):
        def _anonymize_user(label):
            return '.'.join(e[0] + '*' * (len(e) - 1) for e in label.split('.') if e)
        def _anonymize_domain(label):
            if label in ['gmail.com', 'hotmail.com', 'yahoo.com']:  # More than half of addresses domains
                return label
            split_domain = label.split('.')
            return '.'.join([e[0] + '*' * (len(e) - 1) for e in split_domain[:-1] if e] + [split_domain[-1]])
        if not label or '@' not in label:
            return UserError(_('This email address is not valid (%s)', label))
        user, domain = label.split('@')
        return '{}@{}'.format(_anonymize_user(user), _anonymize_domain(domain))