import datetime
import textwrap

import pytest
from pytest import CaptureFixture
from pytest_mock import MockerFixture

from dvc.ui import Console


def test_write(capsys: CaptureFixture[str]):
    """Test that ui.write works."""
    console = Console(enable=True)
    message = "hello world"
    console.write(message)
    console.error_write(message)

    captured = capsys.readouterr()
    assert captured.out == f"{message}\n"
    assert captured.err == f"{message}\n"


@pytest.mark.parametrize(
    "isatty, expected_output",
    [
        (
            True,
            textwrap.dedent(
                """\
        {
          "hello": "world",
          "date": "1970-01-01 00:00:00"
        }
    """
            ),
        ),
        (
            False,
            textwrap.dedent(
                """\
        {"hello": "world", "date": "1970-01-01 00:00:00"}
        """
            ),
        ),
    ],
)
def test_write_json(
    capsys: CaptureFixture[str], mocker: MockerFixture, isatty, expected_output
):
    """Test that ui.write_json works."""

    console = Console(enable=True)
    mocker.patch.object(console, "isatty", return_value=isatty)
    message = {"hello": "world", "date": datetime.datetime(1970, 1, 1)}
    console.write_json(message, default=str)
    captured = capsys.readouterr()
    assert captured.out == expected_output


def test_capsys_works(capsys: CaptureFixture[str]):
    """Sanity check that capsys can capture outputs from a global ui."""
    from dvc.ui import ui

    message = "hello world"
    ui.write(message)
    ui.error_write(message)

    captured = capsys.readouterr()
    assert captured.out == f"{message}\n"
    assert captured.err == f"{message}\n"
