from errno import ENOENT


class InvalidArchiveError(Exception):
    """Raised when libarchive can't open a file"""

    def __init__(self, fn, msg, *args, **kw):
        msg = (
            "Error with archive %s.  You probably need to delete and re-download "
            "or re-create this file.  Message was:\n\n%s" % (fn, msg)
        )
        self.errno = ENOENT
        super().__init__(msg)


class ArchiveCreationError(Exception):
    """Raised when an archive fails during creation"""

    pass


class CaseInsensitiveFileSystemError(InvalidArchiveError):
    def __init__(self, package_location, extract_location, **kwargs):
        message = """
        Cannot extract package to a case-insensitive file system. Your install
        destination does not differentiate between upper and lowercase
        characters, and this breaks things. Try installing to a location that
        is case-sensitive. Windows drives are usually the culprit here - can
        you install to a native Unix drive, or turn on case sensitivity for
        this (Windows) location?

          package location: %(package_location)s
          extract location: %(extract_location)s
        """
        self.package_location = package_location
        self.extract_location = extract_location
        super().__init__(package_location, message, **kwargs)


class ConversionError(Exception):
    def __init__(self, missing_files, mismatching_sizes, *args, **kw):
        self.missing_files = missing_files
        self.mismatching_sizes = mismatching_sizes
        errors = ""
        if self.missing_files:
            errors = "Missing files in converted package: %s\n" % self.missing_files
        errors = (
            errors
            + "Mismatching sizes (corruption) in converted package: %s" % self.mismatching_sizes
        )

        super().__init__(errors, *args, **kw)
