import math


def progress_bar(
    width: int,
    progress: float,
    end_char: str = '|',
    fill_char: str = '-',
    empty_char: str = ' '
) -> str:
    """
    Draw a progress bar that shows the given progress. Will only be full at exactly 100% progress.
    
    :param width: The width of the progress bar, including the ends. The actual progress notches
    will have this width - 2 to fill. If width is less than 3, no progress notches will be in the
    returned string.
    :param progress: The current progress to show. This is a float between 0.0 and 1.0.
    :param end_char: Character to use for the end caps.
    :param fill_char: Character to use for filled progress notches.
    :param empty_char: Character to use for unfilled progress notches.
    """
    notches = width - (len(end_char) * 2)  # account for the 'ends' of the prog bar.
    filled = math.floor(notches * progress)
    empty = notches - filled
    text = end_char + (fill_char * filled) + (empty_char * empty) + end_char
    return text