#!/usr/bin/env python
# -*- coding: future_annotations -*-
import logging
import os
import sys

from gooey import Gooey, GooeyParser

from .constants import (
    RELEASE_URL,
    WEBSITE,
    DEV_WEBSITE,
    DESCRIPTION,
    LONG_DESCRIPTION,
    PROJECT_NAME,
    PROJECT_LICENSE,
    COPYRIGHT_YEAR,
    SUBSYNC_RESOURCES_ENV_MAGIC,
)
# set the env magic so that we look for resources in the right place
if SUBSYNC_RESOURCES_ENV_MAGIC not in os.environ:
    os.environ[SUBSYNC_RESOURCES_ENV_MAGIC] = getattr(sys, '_MEIPASS', '')
from .ffsubsync import run, add_cli_only_args
from .version import get_version, update_available

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


_menu = [
    {
        'name': 'File',
        'items': [
            {
                'type': 'AboutDialog',
                'menuTitle': 'About',
                'name': PROJECT_NAME,
                'description': LONG_DESCRIPTION,
                'version': get_version(),
                'copyright': COPYRIGHT_YEAR,
                'website': WEBSITE,
                'developer': DEV_WEBSITE,
                'license': PROJECT_LICENSE,
            },
            {
                'type': 'Link',
                'menuTitle': 'Download latest release',
                'url': RELEASE_URL,
            }
        ]
    }
]


@Gooey(
    program_name=PROJECT_NAME,
    image_dir=os.path.join(os.environ[SUBSYNC_RESOURCES_ENV_MAGIC], 'img'),
    menu=_menu,
    tabbed_groups=True,
    progress_regex=r"(\d+)%",
    hide_progress_msg=True
)
def make_parser():
    description = DESCRIPTION
    if update_available():
        description += '\nUpdate available! Please go to "File" -> "Download latest release" to update FFsubsync.'
    parser = GooeyParser(description=description)
    main_group = parser.add_argument_group('Basic')
    main_group.add_argument(
        'reference',
        help='Reference (video or subtitles file) to which to synchronize input subtitles.',
        widget='FileChooser'
    )
    main_group.add_argument('srtin', help='Input subtitles file', widget='FileChooser')
    main_group.add_argument('-o', '--srtout',
                            help='Output subtitles file (default=${srtin}.synced.srt).',
                            widget='FileSaver')
    advanced_group = parser.add_argument_group('Advanced')

    # TODO: these are shared between gui and cli; don't duplicate this code
    advanced_group.add_argument('--merge-with-reference', '--merge', action='store_true',
                                help='Merge reference subtitles with synced output subtitles.')
    advanced_group.add_argument('--make-test-case', '--create-test-case', action='store_true',
                                help='If specified, create a test archive a few KiB in size '
                                     'to send to the developer as a debugging aid.')
    advanced_group.add_argument(
        '--reference-stream', '--refstream', '--reference-track', '--reftrack', default=None,
        help='Which stream/track in the video file to use as reference, '
             'formatted according to ffmpeg conventions. For example, s:0 '
             'uses the first subtitle track; a:3 would use the fourth audio track.'
    )
    return parser


def main():
    parser = make_parser()
    _ = parser.parse_args()  # Fool Gooey into presenting the simpler menu
    add_cli_only_args(parser)
    args = parser.parse_args()
    args.gui_mode = True
    return run(args)


if __name__ == "__main__":
    sys.exit(main())
