# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
""" Endurance test of playbacks."""

import argparse
import logging
import random
import time

from cobalt.media_integration_tests.test_app import Features, MediaSessionPlaybackState
from cobalt.media_integration_tests.test_case import TestCase
from cobalt.media_integration_tests.test_util import PlaybackUrls

# The variables below are all in seconds.
STATUS_CHECK_INTERVAL = 0.5
SINGLE_PLAYBACK_WATCH_TIME_MAXIMUM = 2.0 * 60 * 60
PLAYER_INITIALIZATION_WAITING_TIMEOUT = 5.0 * 60
MEDIA_TIME_UPDATE_WAITING_TIMEOUT = 10.0
WRITTEN_INPUT_WAITING_TIMEOUT = 30.0
PLAYBACK_END_WAITING_TIMEOUT = 30.0
# Needs to interact with the app regularly to keep it active. Otherwise, the
# playback may be paused.
IDLE_TIME_MAXIMUM = 60 * 60


class EnduranceTest(TestCase):
  """
    Test case for playback endurance test.
  """

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)

    parser = argparse.ArgumentParser()
    parser.add_argument(
        '--startup_url', default=PlaybackUrls.PLAYLIST, type=str)
    # Stop the test after |max_running_time| (in hours). If |max_running_time|
    # is 0 or negative, the test will not stop until it gets an error.
    parser.add_argument('--max_running_time', default=20, type=float)
    # Insert random actions if |random_action_interval| is greater than 0.
    parser.add_argument('--random_action_interval', default=0.0, type=float)
    args, _ = parser.parse_known_args()

    self.startup_url = args.startup_url
    # Convert |max_running_time| to seconds.
    self.max_running_time = args.max_running_time * 60 * 60
    self.needs_random_action = args.random_action_interval > 0
    self.random_action_interval = args.random_action_interval

  def ResetTimestamps(self):
    self.last_media_time = -1
    self.last_media_time_update_time = -1
    self.last_written_audio_timestamp = -1
    self.last_written_audio_update_time = -1
    self.last_written_video_timestamp = -1
    self.last_written_video_update_time = -1
    self.audio_eos_written_time = -1
    self.video_eos_written_time = -1
    self.playback_end_time = -1

  def OnPlayerStateChanged(self, player_state_handler, player_state):
    current_running_time = time.time() - self.start_time
    element_state = player_state.video_element_state
    pipeline_state = player_state.pipeline_state
    media_session_state = player_state.media_session_state

    if not player_state_handler.IsPlayerPlaying():
      return

    # Reset timestamps after player identifier is changed.
    if self.player_identifier != pipeline_state.identifier:
      self.player_identifier = pipeline_state.identifier
      self.playback_start_time = current_running_time
      self.ResetTimestamps()

    # Reset timestamps after resume. It could happen after pause, fastforward,
    # rewind and playback switch.
    if media_session_state.playback_state != MediaSessionPlaybackState.PLAYING:
      self.playback_is_playing = False
    elif not self.playback_is_playing:
      self.playback_is_playing = True
      self.ResetTimestamps()

    # Update media time.
    if self.last_media_time != element_state.current_time:
      self.last_media_time = element_state.current_time
      self.last_media_time_update_time = current_running_time

    # Update written audio timestamp.
    if (self.last_written_audio_timestamp
        != pipeline_state.last_written_audio_timestamp):
      self.last_written_audio_timestamp = (
          pipeline_state.last_written_audio_timestamp)
      self.last_written_audio_update_time = current_running_time

    # Update written video timestamp.
    if (self.last_written_video_timestamp
        != pipeline_state.last_written_video_timestamp):
      self.last_written_video_timestamp = (
          pipeline_state.last_written_video_timestamp)
      self.last_written_video_update_time = current_running_time

    # Update audio eos timestamp.
    if (self.audio_eos_written_time == -1 and
        pipeline_state.is_audio_eos_written):
      self.audio_eos_written_time = current_running_time

    # Update video eos timestamp.
    if (self.video_eos_written_time == -1 and
        pipeline_state.is_video_eos_written):
      self.video_eos_written_time = current_running_time

    # Update playback end time.
    if (self.audio_eos_written_time != -1 and
        self.video_eos_written_time != -1 and self.playback_end_time == -1 and
        element_state.current_time >= element_state.duration):
      self.playback_end_time = current_running_time

  def GenerateErrorString(self, err_msg):
    return (
        f'{err_msg} (running time: {time.time() - self.start_time}, '
        f'player identifier: "{self.player_identifier}", '
        f'is playing: {self.playback_is_playing}, '
        f'playback start time: {self.playback_start_time}, '
        f'last media time: {self.last_media_time} '
        f'(updated at {self.last_media_time_update_time}), '
        f'last written audio timestamp: {self.last_written_audio_timestamp} '
        f'(updated at {self.last_written_audio_update_time}), '
        f'last written video timestamp: {self.last_written_video_timestamp} '
        f'(updated at {self.last_written_video_update_time}), '
        f'audio eos written at {self.audio_eos_written_time}, '
        f'video eos written at {self.video_eos_written_time}, '
        f'playback ended at {self.playback_end_time}).')

  def SendRandomAction(self, app):

    def SuspendAndResume(app):
      app.Suspend()
      app.WaitUntilReachState(
          lambda _app: not _app.ApplicationState().is_visible)
      # Wait for 1 second before resume.
      time.sleep(1)
      app.Resume()

    actions = {
        'PlayPause': lambda _app: _app.PlayOrPause(),
        'Fastforward': lambda _app: _app.Fastforward(),
        'Rewind': lambda _app: _app.Rewind(),
        'PlayPrevious': lambda _app: _app.PlayPrevious(),
        'PlayNext': lambda _app: _app.PlayNext(),
    }
    if TestCase.IsFeatureSupported(Features.SUSPEND_AND_RESUME):
      actions['SuspendAndResume'] = SuspendAndResume

    action_name = random.choice(list(actions.keys()))
    logging.info('Send random action (%s).', action_name)
    actions[action_name](app)

  def test_playback_endurance(self):  # pylint: disable=invalid-name
    self.start_time = time.time()
    self.player_identifier = ''
    self.playback_is_playing = False
    self.playback_start_time = -1
    self.last_state_check_time = 0
    self.last_action_time = 0
    self.ResetTimestamps()

    app = self.CreateCobaltApp(self.startup_url)
    app.AddPlayerStateChangeHandler(self.OnPlayerStateChanged)
    with app:
      while True:
        # Put the sleep at the top of the loop.
        time.sleep(STATUS_CHECK_INTERVAL)

        current_running_time = time.time() - self.start_time
        # Stop the test after reaching max running time.
        if (self.max_running_time > 0 and
            current_running_time > self.max_running_time):
          break
        # Skip if there's no running player.
        if not app.player_state_handler.IsPlayerPlaying():
          # TODO: identify network problem
          self.assertTrue(
              current_running_time - self.last_state_check_time
              < PLAYER_INITIALIZATION_WAITING_TIMEOUT,
              self.GenerateErrorString(
                  'Timed out waiting for player initialization (waited: '
                  f'{current_running_time - self.last_state_check_time}).'))
          continue
        self.last_state_check_time = current_running_time
        # Skip to next playback if it has been played for long time.
        if (self.playback_start_time != -1 and
            current_running_time - self.playback_start_time
            > SINGLE_PLAYBACK_WATCH_TIME_MAXIMUM):
          app.PlayNext()
          # Set start time to -1 here to avoid send same command in next loop.
          self.playback_start_time = -1
          continue
        if self.playback_is_playing:
          # Check media time.
          if self.last_media_time_update_time > 0:
            # TODO: identify network problem
            self.assertTrue(
                current_running_time - self.last_media_time_update_time <
                MEDIA_TIME_UPDATE_WAITING_TIMEOUT,
                self.GenerateErrorString(
                    'Timed out waiting for media time update (waited: '
                    f'{current_running_time - self.last_media_time_update_time}).'))  # pylint: disable=line-too-long
          # Check written audio timestamp.
          if (self.last_written_audio_update_time > 0 and
              self.audio_eos_written_time == -1):
            self.assertTrue(
                current_running_time - self.last_written_audio_update_time <
                WRITTEN_INPUT_WAITING_TIMEOUT,
                self.GenerateErrorString(
                    'Timed out waiting for new audio input (waited: '
                    f'{current_running_time - self.last_written_audio_update_time}).'))  # pylint: disable=line-too-long
          # Check written video timestamp.
          if (self.last_written_video_update_time > 0 and
              self.video_eos_written_time == -1):
            self.assertTrue(
                current_running_time - self.last_written_video_update_time <
                WRITTEN_INPUT_WAITING_TIMEOUT,
                self.GenerateErrorString(
                    'Timed out waiting for new video input (waited: '
                    f'{current_running_time -self.last_written_video_update_time}).'))  # pylint: disable=line-too-long
          # Check if the playback ends properly.
          if (self.audio_eos_written_time > 0 and
              self.video_eos_written_time > 0 and self.playback_end_time > 0):
            self.assertTrue(
                current_running_time - self.playback_end_time
                < PLAYBACK_END_WAITING_TIMEOUT,
                self.GenerateErrorString(
                    'Timed out waiting for playback to end (waited: '
                    f'{current_running_time - self.playback_end_time}).'))

        # Send random actions.
        if (self.needs_random_action and
            current_running_time - self.last_action_time
            > self.random_action_interval):
          self.SendRandomAction(app)
          self.last_action_time = current_running_time

        # Interact with the app to keep it active.
        if current_running_time - self.last_action_time > IDLE_TIME_MAXIMUM:
          # Play the previous playback again.
          app.PlayPrevious()
          self.last_action_time = current_running_time
          logging.info('Play previous playback to keep app active.')

      app.RemovePlayerStateChangeHandler(self.OnPlayerStateChanged)
