# -*- encoding: utf-8 -*-
##############################################################################
#
#    OpenERP, Open Source Management Solution
#    Copyright (C) 2013 Smile (<http://www.smile.fr>). All Rights Reserved
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################

import logging
import os
import sys
import time

from openerp import tools
from openerp.modules.registry import RegistryManager
from openerp.osv import osv, orm
from openerp.tools import config

from .upgrade import UpgradeManager

_logger = logging.getLogger(__name__)

native_new = RegistryManager.new


@classmethod
def new(cls, db_name, force_demo=False, status=None, update_module=False):
    with cls.lock():
        upgrades = False
        try:
            with UpgradeManager(db_name) as upgrade_manager:
                upgrades = upgrade_manager.upgrades
                if upgrades:
                    cls.signal_registry_change(db_name)
                    t0 = time.time()
                    _logger.info('loading %s upgrade...', upgrade_manager.code_version)
                    if not upgrade_manager.db_in_creation:
                        upgrade_manager.pre_load()
                        modules = upgrade_manager.modules_to_upgrade
                    else:
                        modules = upgrade_manager.modules_to_install_at_creation
                    if modules:
                        registry = native_new(db_name, force_demo)
                        upgrade_manager.force_modules_upgrade(registry, modules)
                    native_new(db_name, force_demo, update_module=True)
                    upgrade_manager.post_load()
                    upgrade_manager.set_db_version()
                    _logger.info('%s upgrade successfully loaded in %ss',
                                 upgrade_manager.code_version, time.time() - t0)
            registry = native_new(db_name, force_demo, update_module=update_module)
            if upgrades and config.get('stop_after_upgrades'):
                _logger.info('Stopping Odoo server')
                os._exit(0)
            return registry
        except Exception, e:
            e.traceback = sys.exc_info()
            if upgrades and config.get('stop_after_upgrades'):
                msg = isinstance(e, (osv.except_osv, orm.except_orm)) and e.value or e
                _logger.error(tools.ustr(msg), exc_info=e.traceback)
                _logger.critical('Upgrade FAILED')
                _logger.info('Stopping Odoo server')
                os._exit(1)
            raise

RegistryManager.new = new