#!/usr/bin/env python

from __future__ import print_function

import sys
import textwrap


def get_arguments():
    import argparse

    parser = argparse.ArgumentParser(textwrap.dedent("""
    This is a simple script that takes input from stdin and prints out any
    lines that are greater than 80+ characters. In such a case, it will print
    out the line number, the length of the line, and the line with whitespace
    stripped. The reason why we print out the line with whitespace stripped is
    that in the case where there is a lot of redundant whitespace, the output
    becomes hard to read and no value is provided in terms of finding the line
    in question.

    Exits with 1 if it finds any violating lines, 0 otherwise."""))

    parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
                        default=sys.stdin,
                        help=textwrap.dedent("""The file to read input from. If
                        no file is provided, stdin is used."""))
    parser.add_argument('-o', '--output', type=argparse.FileType('w'),
                        default=sys.stdout,
                        help=textwrap.dedent("""The file to print to. If no
                             file is provided, stdout is used"""),
                        dest='outfile')
    parser.add_argument('--max-length', type=int, default=80, metavar='LENGTH',
                        help=textwrap.dedent("""Maximum line length that the
                                                script should check for"""))
    parser.add_argument('--count-newline', action='store_false',
                        help=textwrap.dedent("""Should we include the newline
                                                in our line length count"""))
    return parser.parse_args()

args = get_arguments()

found_violation = False

for lineno, line in enumerate(args.infile, start=1):
    # sys.stdin.readlines() includes a newline. So we subtract 1 from our
    # length to get the "true" line length.
    length = len(line) - int(args.count_newline)
    if length > args.max_length:
        found_violation = True
        print("line: {}. length: {}: {}".format(lineno, length, line.strip()),
              file=args.outfile)

sys.exit(found_violation)
