# Copyright 2022 The Pigweed Authors
#
# 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
#
#     https://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.
"""Ensure the given call completes before swarming kills the build."""

import contextlib
import dataclasses

from recipe_engine import recipe_api
from PB.go.chromium.org.luci.lucictx import sections as sections_pb2
from RECIPE_MODULES.fuchsia.utils import nice_duration


class TimeoutApi(recipe_api.RecipeApi):
    """Ensure the given call completes before swarming kills the build."""

    @contextlib.contextmanager
    def __call__(self, buffer_sec=120):
        current_time = self.m.time.time()

        # Amount of time elapsed in the run.
        elapsed_time = (
            current_time - self.m.buildbucket.build.start_time.seconds
        )

        # Amount of time before build times out.
        time_remaining = (
            self.m.buildbucket.build.execution_timeout.seconds - elapsed_time
        )

        # Give a buffer before build times out and kill this step then. This
        # should give enough time to read any logfiles and maybe upload to
        # logdog/GCS before the build times out.
        timeout = time_remaining - buffer_sec

        soft_deadline = current_time + timeout

        with self.m.step.nest(
            'timeout {}'.format(nice_duration(timeout))
        ) as pres:
            pres.step_summary_text = f'soft_deadline: {soft_deadline}'

        deadline = sections_pb2.Deadline()
        deadline.soft_deadline = soft_deadline
        deadline.grace_period = 30.0

        try:
            with self.m.context(deadline=deadline):
                yield

        finally:
            pass
