text: '''
  manga-py module for CLI and its options.
  '''
  
  from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, RawDescriptionHelpFormatter
  
  from manga_py.meta import __version__
  
  
  class DescriptionDefaultsHelpFormatter(ArgumentDefaultsHelpFormatter,
                                         RawDescriptionHelpFormatter):
      '''
      Class to format --help cli option with 2 features to output:
          programm's description in a raw mode,
          options default values.
      '''
  
  
  def _image_args(args_parser):  # pragma: no cover
      args = args_parser.add_argument_group('Image options')
  
      args.add_argument(
          '-E',
          '--not-change-files-extension',
          action='store_true',
          help=(
              'Save downloaded files to archive "as is".'
          )
      )
  
      args.add_argument(
          '-W',
          '--no-webp',
          action='store_true',
          help=(
              'Convert `*.webp` images to `*.jpg` format.'
          )
      )
  
  
  def _debug_args(args_parser):  # pragma: no cover
      args = args_parser.add_argument_group('Debug / Simulation options')
  
      args.add_argument(
          '-h',
          '--help',
          action='help',
          help=(
              'Show this help and exit.'
          )
      )
  
      args.add_argument(
          '-j',
          '--print-json',
          action='store_true',
          help=(
              'Print information about the results in the JSON format (after completion).'
          )
      )
  
      args.add_argument(
          '-l',
          '--simulate',
          action='store_true',
          help=(
              'Simulate running %(prog)s, where: '
              '1) do not download files and, '
              '2) do not write anything on disk.'
          )
      )
  
      args.add_argument(
          '-i',
          '--show-current-chapter-info',
          action='store_true',
          help=(
              'Show current processing chapter info.'
          )
      )
  
      args.add_argument(
          '-b',
          '--debug',
          action='store_true',
          help=(
              'Debug %(prog)s.'
          )
      )
  
      args.add_argument(
          '-q',
          '--quiet',
          action='store_true',
          help=(
              'Dont show any messages.'
          )
      )
  
  
  def _downloading_args(args_parser):  # pragma: no cover
      args = args_parser.add_argument_group('Downloading options')
  
      args.add_argument(
          '-s',
          '--skip-volumes',
          metavar='COUNT',
          type=int,
          help=(
              'Skip a total number, i.e. %(metavar)s, of volumes.'
          ),
          default=0
      )
  
      args.add_argument(
          '-m',
          '--max-volumes',
          metavar='COUNT',
          type=int,
          default=0,
          help=(
              'Download a maximum number, i.e. %(metavar)s, of volumes. '
              'E.g.: `--max-volumes 2` will download at most 2 volumes. '
              'If %(metavar)s is `0` (zero) then it will download all available volumes.'
          )
      )
  
      args.add_argument(
          '-a',
          '--user-agent',
          type=str,
          help=(
              'Set an user-agent. '
              'Don\'t work from protected sites.'
          )
      )
  
      args.add_argument(
          '-x',
          '--proxy',
          type=str,
          help=(
              'Set a http proxy.'
          )
      )
  
      args.add_argument(
          '-e',
          '--reverse-downloading',
          action='store_true',
          help=(
              'Download manga volumes in a reverse order. '
              'By default, manga is downloaded in ascendent order '
              '(i.e. volume 00, volume 01, volume 02...). '
              'If `--reverse-downloading` is actived, then manga is downloaded in descendent order '
              '(i.e. volume 99, volume 98, volume 97...).'
          )
      )
  
      args.add_argument(
          '-w',
          '--rewrite-exists-archives',
          action='store_true',
          help=(
              '(Re)Download manga volume if it already exists locally in the directory destination. '
              'Your manga files can be overwrited, so be careful.'
          )
      )
  
      args.add_argument(
          '-t',
          '--max-threads',
          type=int,
          default=None,
          help=(
              'Set the maximum number of threads, i.e. MAX_THREADS, to be avaliable to manga-py. '
              'Threads run in pseudo-parallel when execute the process to download the manga images.'
          )
      )
  
      args.add_argument(
          '-f',
          '--zero-fill',
          action='store_true',
          help=(
              'Pad a `-0` (dash-and-zero) at right for all downloaded manga volume filenames. '
              'E.g. from `vol_001.zip` to `vol_001-0.zip`. '
              'It is useful to standardize the filenames between: '
              '1) normal manga volumes (e.g. vol_006.zip) and, '
              '2) abnormal manga volumes (e.g. vol_006-5.zip). '
              'An abnormal manga volume is a released volume like: '
              'extra chapters, '
              'bonuses, '
              'updated, '
              'typos corrected, '
              'spelling errors corrected; '
              'and so on.'
          )
      )
  
      args.add_argument(
          '-g',
          '--with-manga-name',
          action='store_true',
          help=(
              'Pad the manga name at left for all downloaded manga volumes filenames. '
              'E.g. from `vol_001.zip` to `manga_name-vol_001.zip`.'
          )
      )
  
      args.add_argument(
          '-o',
          '--override-archive-name',
          metavar='ARCHIVE_NAME',
          type=str,
          default='',
          dest='override_archive_name',
          help=(
              'Pad %(metavar)s at left for all downloaded manga volumes filename. '
              'E.g from `vol_001.zip` to `%(metavar)s-vol_001.zip`.'
          )
      )
  
      args.add_argument(
          '-c',
          '--min-free-space',
          metavar='MB',
          type=int,
          default=100,
          help=(
              'Alert when the minimum free disc space, i.e. MB, is reached. '
              'Insert it in order of megabytes (Mb).'
          )
      )
  
  
  def _reader_args(args_parser):  # pragma: no cover
      args = args_parser.add_argument_group('Archive options')
  
      args.add_argument(
          '-z',
          '--cbz',
          action='store_true',
          help=(
              'Make `*.cbz` archives (for reader).'
          )
      )
  
      args.add_argument(
          '-r',
          '--rename-pages',
          action='store_true',
          help=(
              'Normalize image filenames. '
              'E.g. from `0_page_1.jpg` to `0001.jpg`.'
          )
      )
  
  
  def get_cli_arguments() -> ArgumentParser:  # pragma: no cover
      '''
      Method to generate manga-py CLI with its options.
      '''
      args_parser = ArgumentParser(
          add_help=False,
          formatter_class=DescriptionDefaultsHelpFormatter,
          prog="manga-py",
          description=(
              '%(prog)s is the universal manga downloader (for your offline reading).\n  '
              'Site: https://manga-py.com/manga-py/\n  '
              'Source-code: https://github.com/manga-py/manga-py\n  '
              'Version: ' + __version__
          ),
          epilog=(
              'So, that is how %(prog)s can be executed to download yours favourite mangas.\n'
              'Enjoy! 😉'
          )
      )
  
      args = args_parser.add_argument_group('General options')
  
      args.add_argument(
          'url',
          metavar='URL',
          type=str,
          help=(
              '%(metavar)s, i.e. link from manga, to be downloaded.'
          )
      )
  
      args.add_argument(
          '-v',
          '--version',
          action='version',
          version=__version__,
          help=(
              'Show %(prog)s\'s version number and exit.'
          )
      )
  
      args.add_argument(
          '-n',
          '--name',
          metavar='NAME',
          type=str,
          default='',
          help=(
              'Rename manga, i.e. by %(metavar)s, and its folder to where it will be saved locally.'
          )
      )
  
      args.add_argument(
          '-d',
          '--destination',
          metavar='PATH',
          type=str,
          default='Manga',
          help=(
              'Destination folder to where the manga will be saved locally. '
              'The path will be `./%(metavar)s/manga_name/`.'
          )
      )
  
      args.add_argument(
          '-P',
          '--no-progress',
          action='store_true',
          help=(
              'Don\'t show progress bar.'
          )
      )
  
      _image_args(args_parser)
      _reader_args(args_parser)
      _downloading_args(args_parser)
      _debug_args(args_parser)
  
      return args_parser
  