"""  # lint-amnesty, pylint: disable=cyclic-import
XFields for video block.
"""


import datetime

from xblock.fields import Boolean, DateTime, Dict, Float, List, RelativeTime, Scope, String


# Make '_' a no-op so we can scrape strings. Using dummy function instead of
#  `django.utils.translation.gettext_noop` because Django cannot be imported in this file
def _(text):
    return text


class VideoFields:
    """Fields for `VideoBlock`."""
    data = String(default="", scope=Scope.content)

    display_name = String(
        help=_("The display name for this component."),
        display_name=_("Component Display Name"),
        default="Video",
        scope=Scope.settings
    )

    saved_video_position = RelativeTime(
        help=_("Current position in the video."),
        scope=Scope.user_state,
        default=datetime.timedelta(seconds=0)
    )
    # TODO: This should be moved to Scope.content, but this will
    # require data migration to support the old video block.
    youtube_id_1_0 = String(
        help=_("Optional, for older browsers: the YouTube ID for the normal speed video."),
        display_name=_("YouTube ID"),
        scope=Scope.settings,
        default="3_yD_cEKoCk"
    )
    youtube_id_0_75 = String(
        help=_("Optional, for older browsers: the YouTube ID for the .75x speed video."),
        display_name=_("YouTube ID for .75x speed"),
        scope=Scope.settings,
        default=""
    )
    youtube_id_1_25 = String(
        help=_("Optional, for older browsers: the YouTube ID for the 1.25x speed video."),
        display_name=_("YouTube ID for 1.25x speed"),
        scope=Scope.settings,
        default=""
    )
    youtube_id_1_5 = String(
        help=_("Optional, for older browsers: the YouTube ID for the 1.5x speed video."),
        display_name=_("YouTube ID for 1.5x speed"),
        scope=Scope.settings,
        default=""
    )
    start_time = RelativeTime(  # datetime.timedelta object
        help=_(
            "Time you want the video to start if you don't want the entire video to play. "
            "Not supported in the native mobile app: the full video file will play. "
            "Formatted as HH:MM:SS. The maximum value is 23:59:59."
        ),
        display_name=_("Video Start Time"),
        scope=Scope.settings,
        default=datetime.timedelta(seconds=0)
    )
    end_time = RelativeTime(  # datetime.timedelta object
        help=_(
            "Time you want the video to stop if you don't want the entire video to play. "
            "Not supported in the native mobile app: the full video file will play. "
            "Formatted as HH:MM:SS. The maximum value is 23:59:59."
        ),
        display_name=_("Video Stop Time"),
        scope=Scope.settings,
        default=datetime.timedelta(seconds=0)
    )
    # front-end code of video player checks logical validity of (start_time, end_time) pair.

    download_video = Boolean(
        help=_("Allow students to download versions of this video in different formats if they cannot use the edX video"
               " player or do not have access to YouTube. You must add at least one non-YouTube URL "
               "in the Video File URLs field."),
        display_name=_("Video Download Allowed"),
        scope=Scope.settings,
        default=False
    )
    html5_sources = List(
        help=_("The URL or URLs where you've posted non-YouTube versions of the video. Each URL must end in .mpeg,"
               " .mp4, .ogg, or .webm and cannot be a YouTube URL. (For browser compatibility, we strongly recommend"
               " .mp4 and .webm format.) Students will be able to view the first listed video that's compatible with"
               " the student's computer. To allow students to download these videos, "
               "set Video Download Allowed to True."),
        display_name=_("Video File URLs"),
        scope=Scope.settings,
    )
    track = String(
        help=_("By default, students can download an .srt or .txt transcript when you set Download Transcript "
               "Allowed to True. If you want to provide a downloadable transcript in a different format, we recommend "
               "that you upload a handout by using the Upload a Handout field. If this isn't possible, you can post a "
               "transcript file on the Files & Uploads page or on the Internet, and then add the URL for the "
               "transcript here. Students see a link to download that transcript below the video."),
        display_name=_("Downloadable Transcript URL"),
        scope=Scope.settings,
        default=''
    )
    download_track = Boolean(
        help=_("Allow students to download the timed transcript. A link to download the file appears below the video."
               " By default, the transcript is an .srt or .txt file. If you want to provide the transcript for "
               "download in a different format, upload a file by using the Upload Handout field."),
        display_name=_("Download Transcript Allowed"),
        scope=Scope.settings,
        default=False
    )
    # `sub` is deprecated field and should not be used in future. Now, transcripts are primarily handled in VAL and
    # backward compatibility for the video blocks already using this field has been ensured.
    sub = String(
        help=_("The default transcript for the video, from the Default Timed Transcript field on the Basic tab. "
               "This transcript should be in English. You don't have to change this setting."),
        display_name=_("Default Timed Transcript"),
        scope=Scope.settings,
        default=""
    )
    show_captions = Boolean(
        help=_("Specify whether the transcripts appear with the video by default."),
        display_name=_("Show Transcript"),
        scope=Scope.settings,
        default=True
    )
    # Data format: {'de': 'german_translation', 'uk': 'ukrainian_translation'}
    transcripts = Dict(
        help=_("Add transcripts in different languages."
               " Click below to specify a language and upload an .srt transcript file for that language."),
        display_name=_("Transcript Languages"),
        scope=Scope.settings,
        default={}
    )
    transcript_language = String(
        help=_("Preferred language for transcript."),
        display_name=_("Preferred language for transcript"),
        scope=Scope.preferences,
        default="en"
    )
    transcript_download_format = String(
        help=_("Transcript file format to download by user."),
        scope=Scope.preferences,
        values=[
            # Translators: This is a type of file used for captioning in the video player.
            {"display_name": _("SubRip (.srt) file"), "value": "srt"},
            {"display_name": _("Text (.txt) file"), "value": "txt"}
        ],
        default='srt',
    )
    speed = Float(
        help=_("The last speed that the user specified for the video."),
        scope=Scope.user_state
    )
    global_speed = Float(
        help=_("The default speed for the video."),
        scope=Scope.preferences,
        default=1.0
    )
    auto_advance = Boolean(
        help=_("Specify whether to advance automatically to the next unit when the video ends."),
        scope=Scope.preferences,
        # The default is True because this field only has an effect when auto-advance controls are enabled
        # (globally enabled through feature flag and locally enabled through course setting); in that case
        # it's good to start auto-advancing and let the student disable it, instead of the other way around
        # (requiring the user to enable it). When auto-advance controls are hidden, this field won't be used.
        default=True,
    )
    youtube_is_available = Boolean(
        help=_("Specify whether YouTube is available for the user."),
        scope=Scope.user_info,
        default=True
    )
    handout = String(
        help=_("Upload a handout to accompany this video. Students can download the handout by "
               "clicking Download Handout under the video."),
        display_name=_("Upload Handout"),
        scope=Scope.settings,
    )
    only_on_web = Boolean(
        help=_(
            "Specify whether access to this video is limited to browsers only, or if it can be "
            "accessed from other applications including mobile apps."
        ),
        display_name=_("Video Available on Web Only"),
        scope=Scope.settings,
        default=False
    )
    edx_video_id = String(
        help=_("If you were assigned a Video ID by edX for the video to play in this component, enter the ID here."
               " In this case, do not enter values in the Default Video URL, the Video File URLs, "
               "and the YouTube ID fields. If you were not assigned a Video ID,"
               " enter values in those other fields and ignore this field."),
        display_name=_("Video ID"),
        scope=Scope.settings,
        default="",
    )
    bumper_last_view_date = DateTime(
        display_name=_("Date of the last view of the bumper"),
        scope=Scope.preferences,
    )
    bumper_do_not_show_again = Boolean(
        display_name=_("Do not show bumper again"),
        scope=Scope.preferences,
        default=False,
    )
    public_access = Boolean(
        help=_("Specify whether the video can be accessed publicly by learners."),
        display_name=_("Public Access"),
        scope=Scope.settings,
        default=False
    )
    # thumbnail is need as a field for the new video editor. The field is hidden in
    # the legacy modal.
    thumbnail = String(
        help=_("Add a specific thumbnail for learners to see before playing the video."),
        display_name=_("Thumbnail"),
        scope=Scope.settings,
        default="",
    )
