#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import sys
import os
import argparse

from pytube import YouTube
from pytube.utils import print_status, FullPaths
from pytube.exceptions import PytubeError
from pprint import pprint


def main():
    parser = argparse.ArgumentParser(description='YouTube video downloader')
    parser.add_argument("url", help=(
        "The URL of the Video to be downloaded"))
    parser.add_argument("--extension", "-e", dest="ext", help=(
        "The requested format of the video"))
    parser.add_argument("--resolution", "-r", dest="res", help=(
        "The requested resolution"))
    parser.add_argument("--path", "-p", action=FullPaths, default=os.getcwd(),
                        dest="path", help=("The path to save the video to."))
    parser.add_argument("--filename", "-f", dest="filename", help=(
        "The filename, without extension, to save the video in."))

    args = parser.parse_args()

    try:
        yt = YouTube(args.url)
        videos = []
        for i, video in enumerate(yt.get_videos()):
            ext = video.extension
            res = video.resolution
            videos.append("{} {}".format(ext, res))
    except PytubeError:
        print("Incorrect video URL.")
        sys.exit(1)

    if args.filename:
        yt.set_filename(args.filename)

    if args.ext or args.res:
        if not all([args.ext, args.res]):
            print("Make sure you give either of the below specified "
                  "format/resolution combination.")
            pprint(videos)
            sys.exit(1)

    if args.ext and args.res:
        # There's only ope video that matches both so get it
        vid = yt.get(args.ext, args.res)
        # Check if there's a video returned
        if not vid:
            print("There's no video with the specified format/resolution "
                  "combination.")
            pprint(videos)
            sys.exit(1)

    elif args.ext:
        # There are several videos with the same extension
        videos = yt.filter(extension=args.ext)
        # Check if we have a video
        if not videos:
            print("There are no videos in the specified format.")
            sys.exit(1)
        # Select the highest resolution one
        vid = max(videos)
    elif args.res:
        # There might be several videos in the same resolution
        videos = yt.filter(res=args.res)
        # Check if we have a video
        if not videos:
            print("There are no videos in the specified in the specified "
                  "resolution.")
            sys.exit(1)
        # Select the highest resolution one
        vid = max(videos)
    else:
        # If nothing is specified get the highest resolution one
        vid = max(yt.get_videos())

    try:
        vid.download(path=args.path, on_progress=print_status)
    except KeyboardInterrupt:
        print("Download interrupted.")
        sys.exit(1)

if __name__ == '__main__':
    main()
