import os

# Get environment variables
smtp_host = os.environ.get('ODOO_MAIL_SMTP_HOST', '')
smtp_port = int(os.environ.get('ODOO_MAIL_SMTP_PORT', 587))
smtp_encryption = os.environ.get('ODOO_MAIL_SMTP_ENCRYPTION', 'starttls')
smtp_from_filter = os.environ.get('ODOO_MAIL_SMTP_FROM_FILTER', '')
imap_host = os.environ.get('ODOO_MAIL_IMAP_HOST', '')
imap_port = int(os.environ.get('ODOO_MAIL_IMAP_PORT', 993))
imap_ssl = os.environ.get('ODOO_MAIL_IMAP_SSL', 'True') == 'True'
mail_user = os.environ.get('ODOO_MAIL_USER', '')
mail_password = os.environ.get('ODOO_MAIL_PASSWORD', '')
mail_bounce_alias = os.environ.get('MAIL_BOUNCE_ALIAS', '')
mail_catchall_alias = os.environ.get('MAIL_CATCHALL_ALIAS', '')
mail_catchall_domain = os.environ.get('MAIL_CATCHALL_DOMAIN', '')
mail_default_from = os.environ.get('MAIL_DEFAULT_FROM', '')
mail_alias_domain = os.environ.get('MAIL_ALIAS_DOMAIN', '')

# Setup outgoing mail server
if smtp_host:
    print("Setup outgoing mail server.")
    ir_mail_server = {
        'name': smtp_host,
        'smtp_host': smtp_host,
        'smtp_port': smtp_port,
        'smtp_user': mail_user,
        'smtp_pass': mail_password,
        'smtp_encryption': smtp_encryption,
        'from_filter': smtp_from_filter
    }
    ir_mail_server_id = env['ir.mail_server'].search([('name', '=', smtp_host)], limit=1)
    if ir_mail_server_id:
        ir_mail_server_id.write(ir_mail_server)
    else:
        env['ir.mail_server'].create(ir_mail_server)
    env.cr.commit()

# Setup incoming mail server
if imap_host:
    print("Setup incoming mail server.")
    fetchmail_server = {
        'name': imap_host,
        'server': imap_host,
        'port': imap_port,
        'user': mail_user,
        'password': mail_password,
        'is_ssl': imap_ssl,
        'state': 'done'
    }
    fetchmail_server_id = env['fetchmail.server'].search([('name', '=', imap_host)], limit=1)
    if fetchmail_server_id:
        fetchmail_server_id.write(fetchmail_server)
    else:
        env['fetchmail.server'].create(fetchmail_server)
    env.cr.commit()

# Setup system parameters
if mail_bounce_alias:
    print(f"Set mail bounce alias: {mail_bounce_alias}")
    mail_bounce_alias_id = env['ir.config_parameter'].search([('key', '=', 'mail.bounce.alias')], limit=1)
    if not mail_bounce_alias_id:
        env['ir.config_parameter'].create({'key': 'mail.bounce.alias', 'value': mail_bounce_alias})
    elif mail_bounce_alias_id.value != mail_bounce_alias:
        mail_bounce_alias_id.write({'value': mail_bounce_alias})
    env.cr.commit()

if mail_catchall_alias:
    print(f"Set mail catchall alias: {mail_catchall_alias}")
    mail_catchall_alias_id = env['ir.config_parameter'].search([('key', '=', 'mail.catchall.alias')], limit=1)
    if not mail_catchall_alias_id:
        env['ir.config_parameter'].create({'key': 'mail.catchall.alias', 'value': mail_catchall_alias})
    elif mail_catchall_alias_id.value != mail_catchall_alias:
        mail_catchall_alias_id.write({'value': mail_catchall_alias})
    env.cr.commit()

if mail_catchall_domain:
    print(f"Set mail catchall domain: {mail_catchall_domain}")
    mail_catchall_domain_id = env['ir.config_parameter'].search([('key', '=', 'mail.catchall.domain')], limit=1)
    if not mail_catchall_domain_id:
        env['ir.config_parameter'].create({'key': 'mail.catchall.domain', 'value': mail_catchall_domain})
    elif mail_catchall_domain_id.value != mail_catchall_domain:
        mail_catchall_domain_id.write({'value': mail_catchall_domain})
    env.cr.commit()

if mail_default_from:
    print(f"Set mail default from: {mail_default_from}")
    mail_default_from_id = env['ir.config_parameter'].search([('key', '=', 'mail.default.from')], limit=1)
    if not mail_default_from_id:
        env['ir.config_parameter'].create({'key': 'mail.default.from', 'value': mail_default_from})
    elif mail_default_from_id.value != mail_default_from:
        mail_default_from_id.write({'value': mail_default_from})
    env.cr.commit()

# Setup mail alias domain
if mail_alias_domain:
    try:
        env['mail.alias.domain']
        has_alias_domain_model = True
    except KeyError:
        has_alias_domain_model = False

    if has_alias_domain_model:
        company = env.user.company_id
        values = {
            'name': mail_alias_domain,
        }
        if mail_bounce_alias:
            values['bounce_alias'] = mail_bounce_alias
        if mail_catchall_alias:
            values['catchall_alias'] = mail_catchall_alias
        if mail_default_from:
            values['default_from'] = mail_default_from

        domain_id = env['mail.alias.domain'].search([
            ('name', '=', mail_alias_domain),
        ], limit=1)

        if domain_id:
            print(f"Update existing mail alias domain: {mail_alias_domain}")
            domain_id.write(values)
        else:
            print(f"Create new mail alias domain: {mail_alias_domain}")
            env['mail.alias.domain'].create(values)
    env.cr.commit()
