# Copyright (C) 2008 The Android Open Source Project
#
# 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.

import os
import select
import subprocess
import sys

import platform_utils


active = False
pager_process = None
old_stdout = None
old_stderr = None


def RunPager(globalConfig):
    if not os.isatty(0) or not os.isatty(1):
        return
    pager = _SelectPager(globalConfig)
    if pager == "" or pager == "cat":
        return

    if platform_utils.isWindows():
        _PipePager(pager)
    else:
        _ForkPager(pager)


def TerminatePager():
    global pager_process, old_stdout, old_stderr
    if pager_process:
        sys.stdout.flush()
        sys.stderr.flush()
        pager_process.stdin.close()
        pager_process.wait()
        pager_process = None
        # Restore initial stdout/err in case there is more output in this
        # process after shutting down the pager process.
        sys.stdout = old_stdout
        sys.stderr = old_stderr


def _PipePager(pager):
    global pager_process, old_stdout, old_stderr
    assert pager_process is None, "Only one active pager process at a time"
    # Create pager process, piping stdout/err into its stdin.
    try:
        pager_process = subprocess.Popen(
            [pager], stdin=subprocess.PIPE, stdout=sys.stdout, stderr=sys.stderr
        )
    except FileNotFoundError:
        sys.exit(f'fatal: cannot start pager "{pager}"')
    old_stdout = sys.stdout
    old_stderr = sys.stderr
    sys.stdout = pager_process.stdin
    sys.stderr = pager_process.stdin


def _ForkPager(pager):
    global active
    # This process turns into the pager; a child it forks will
    # do the real processing and output back to the pager. This
    # is necessary to keep the pager in control of the tty.
    try:
        r, w = os.pipe()
        pid = os.fork()
        if not pid:
            os.dup2(w, 1)
            os.dup2(w, 2)
            os.close(r)
            os.close(w)
            active = True
            return

        os.dup2(r, 0)
        os.close(r)
        os.close(w)

        _BecomePager(pager)
    except Exception:
        print("fatal: cannot start pager '%s'" % pager, file=sys.stderr)
        sys.exit(255)


def _SelectPager(globalConfig):
    try:
        return os.environ["GIT_PAGER"]
    except KeyError:
        pass

    pager = globalConfig.GetString("core.pager")
    if pager:
        return pager

    try:
        return os.environ["PAGER"]
    except KeyError:
        pass

    return "less"


def _BecomePager(pager):
    # Delaying execution of the pager until we have output
    # ready works around a long-standing bug in popularly
    # available versions of 'less', a better 'more'.
    _a, _b, _c = select.select([0], [], [0])

    # This matches the behavior of git, which sets $LESS to `FRX` if it is not
    # set. See:
    # https://git-scm.com/docs/git-config#Documentation/git-config.txt-corepager
    os.environ.setdefault("LESS", "FRX")

    try:
        os.execvp(pager, [pager])
    except OSError:
        os.execv("/bin/sh", ["sh", "-c", pager])
