import email
import importlib.resources
import mimetypes
from urllib.request import URLError
import urllib.request


class PkgHandler(urllib.request.BaseHandler):
    """
    """
    def pkg_open(self, req) -> urllib.request.addinfourl:
        pkg_files = importlib.resources.files(req.host)

        try:
            fh = next(
                pkg_files.glob(req.selector.lstrip('//'))
            ).open('rb')
        except Exception as e:
            raise URLError(f'{e.__class__.__name__}: {e}') from e

        fh.seek(0, 2);
        size = fh.tell();
        fh.seek(0);

        mtype, compression = mimetypes.guess_type(req.selector)

        if compression and mtype:
            mtype = f"{mtype}+{compression}"

        headers = email.message_from_string(
            'Content-Type: %s\nContent-Length: %d\n' %
            (mtype or 'text/plain', size)
        )

        if not mtype or mtype.startswith('text/'):
            fh.close()
            fh = next(
                pkg_files.glob(req.selector.lstrip('//'))
            ).open('r')

        return urllib.request.addinfourl(fh, headers, None)
