import sys

from . import utils


def install_shims():
    """Install shims to fix version incompatibility"""
    install_bottle_import_redirect_shim()


def install_bottle_import_redirect_shim():
    """
    https://github.com/brentvollebregt/auto-py-to-exe/issues/433 explains that a ModuleNotFoundError is raised when trying
    to import bottle extensions using Python 3.12.
    This shim will patch this issue with some code that is currently on bottle's main branch.
    This shim is only needed on Python versions >=3.12 and bottle versions <=0.12.25 (hoping the next version fixes this issue)
    """

    # First check if setting this shim is needed
    if sys.version_info < (3, 12):
        return
    
    import bottle
    if utils.parse_version_tuple(bottle.__version__) > (0, 12, 25):
        return

    if hasattr(bottle._ImportRedirect, 'find_spec'):
        return
    
    print(f'Warning: Installing shim for bottle import redirects (using Python={sys.version_info[0]}.{sys.version_info[1]}.{sys.version_info[2]} and bottle={bottle.__version__})')

    # Add the shim
    def find_spec(self, fullname, path, target=None):
        if '.' not in fullname: return
        if fullname.rsplit('.', 1)[0] != self.name: return
        from importlib.util import spec_from_loader
        return spec_from_loader(fullname, self)
    bottle._ImportRedirect.find_spec = find_spec
