from odoo import fields, models, _
from odoo.tools.mail import parse_contact_from_email


class MailTestTLead(models.Model):
    """ Lead-like model for business flows testing """
    _name = "mail.test.lead"
    _description = 'Lead-like model'
    _inherit = [
        'mail.thread.blacklist',
        'mail.thread.cc',
        'mail.activity.mixin',
    ]
    _mail_defaults_to_email = True
    _primary_email = 'email_from'

    name = fields.Char()
    company_id = fields.Many2one('res.company')
    user_id = fields.Many2one('res.users', tracking=1)
    email_from = fields.Char()
    customer_name = fields.Char()
    partner_id = fields.Many2one('res.partner', tracking=2)
    lang_code = fields.Char()
    mobile = fields.Char()
    phone = fields.Char()

    def _creation_message(self):
        self.ensure_one()
        return _('A new lead has been created and is assigned to %(user_name)s.', user_name=self.user_id.name or _('nobody'))

    def _get_customer_information(self):
        email_normalized_to_values = super()._get_customer_information()

        for lead in self:
            email_key = lead.email_normalized or lead.email
            values = email_normalized_to_values.setdefault(email_key, {})
            values['lang'] = values.get('lang') or lead.lang_code
            values['name'] = values.get('name') or lead.customer_name or parse_contact_from_email(lead.email_from)[0] or lead.email_from
            values['mobile'] = values.get('mobile') or lead.mobile
            values['phone'] = values.get('phone') or lead.phone
        return email_normalized_to_values

    def _message_get_suggested_recipients(self):
        recipients = super()._message_get_suggested_recipients()
        # check if that language is correctly installed (and active) before using it
        lang_code = self.env['res.lang']._get_data(code=self.lang_code).code or None
        if self.partner_id:
            self._message_add_suggested_recipient(
                recipients, partner=self.partner_id, lang=lang_code, reason=_('Customer'))
        elif self.email_from:
            self._message_add_suggested_recipient(
                recipients, email=self.email_from, lang=lang_code, reason=_('Customer Email'))
        return recipients

    def _message_post_after_hook(self, message, msg_vals):
        if self.email_from and not self.partner_id:
            # we consider that posting a message with a specified recipient (not a follower, a specific one)
            # on a document without customer means that it was created through the chatter using
            # suggested recipients. This heuristic allows to avoid ugly hacks in JS.
            new_partner = message.partner_ids.filtered(
                lambda partner: partner.email == self.email_from or (self.email_normalized and partner.email_normalized == self.email_normalized)
            )
            if new_partner:
                if new_partner[0].email_normalized:
                    email_domain = ('email_normalized', '=', new_partner[0].email_normalized)
                else:
                    email_domain = ('email_from', '=', new_partner[0].email)
                self.search([('partner_id', '=', False), email_domain]).write({'partner_id': new_partner[0].id})
        return super()._message_post_after_hook(message, msg_vals)
