"""渲染适配器纯逻辑测试 — _parse_resolution 等纯函数."""

from __future__ import annotations

from pathlib import Path

import pytest
from video_processing.render_adapter import (
    DEFAULT_OUTPUT_HEIGHT,
    DEFAULT_OUTPUT_WIDTH,
    RenderAdapterResult,
    _parse_resolution,
)


class TestParseResolution:
    """_parse_resolution 分辨率字符串解析测试."""

    def test_standard_format(self):
        """标准 宽x高 格式."""
        w, h = _parse_resolution("1920x1080")
        assert w == 1920
        assert h == 1080

    def test_portrait_format(self):
        """竖屏格式."""
        w, h = _parse_resolution("1080x1920")
        assert w == 1080
        assert h == 1920

    def test_lowercase_x(self):
        """小写x."""
        w, h = _parse_resolution("1280x720")
        assert w == 1280
        assert h == 720

    def test_uppercase_x_returns_default(self):
        """大写X不匹配小写x → 返回默认值（只支持小写x）."""
        w, h = _parse_resolution("1280X720")
        assert w == DEFAULT_OUTPUT_WIDTH
        assert h == DEFAULT_OUTPUT_HEIGHT

    def test_none_returns_default(self):
        """None返回默认值."""
        w, h = _parse_resolution(None)
        assert w == DEFAULT_OUTPUT_WIDTH
        assert h == DEFAULT_OUTPUT_HEIGHT

    def test_empty_string_returns_default(self):
        """空字符串返回默认值."""
        w, h = _parse_resolution("")
        assert w == DEFAULT_OUTPUT_WIDTH
        assert h == DEFAULT_OUTPUT_HEIGHT

    def test_no_x_returns_default(self):
        """没有x的字符串返回默认值."""
        w, h = _parse_resolution("1080p")
        assert w == DEFAULT_OUTPUT_WIDTH
        assert h == DEFAULT_OUTPUT_HEIGHT

    def test_invalid_width_returns_default(self):
        """宽度无效返回默认值."""
        w, h = _parse_resolution("abcx1080")
        assert w == DEFAULT_OUTPUT_WIDTH
        assert h == DEFAULT_OUTPUT_HEIGHT

    def test_invalid_height_returns_default(self):
        """高度无效返回默认值."""
        w, h = _parse_resolution("1920xabc")
        assert w == DEFAULT_OUTPUT_WIDTH
        assert h == DEFAULT_OUTPUT_HEIGHT

    def test_zero_width_returns_default(self):
        """宽度为0返回默认值."""
        w, h = _parse_resolution("0x1080")
        assert w == DEFAULT_OUTPUT_WIDTH
        assert h == DEFAULT_OUTPUT_HEIGHT

    def test_zero_height_returns_default(self):
        """高度为0返回默认值."""
        w, h = _parse_resolution("1920x0")
        assert w == DEFAULT_OUTPUT_WIDTH
        assert h == DEFAULT_OUTPUT_HEIGHT

    def test_negative_width_returns_default(self):
        """负宽度返回默认值."""
        w, h = _parse_resolution("-100x1080")
        assert w == DEFAULT_OUTPUT_WIDTH
        assert h == DEFAULT_OUTPUT_HEIGHT

    def test_with_spaces(self):
        """带空格的能正确strip."""
        w, h = _parse_resolution(" 1920 x 1080 ")
        assert w == 1920
        assert h == 1080

    def test_multiple_x_returns_default(self):
        """多个x的字符串解析失败 → 返回默认值."""
        w, h = _parse_resolution("100x200x300")
        # split("x", 1)后h部分是"200x300"，int失败返回默认
        assert w == DEFAULT_OUTPUT_WIDTH
        assert h == DEFAULT_OUTPUT_HEIGHT

    def test_square_resolution(self):
        """正方形分辨率."""
        w, h = _parse_resolution("512x512")
        assert w == 512
        assert h == 512

    def test_default_values_are_reasonable(self):
        """默认值合理（竖屏短视频）."""
        assert DEFAULT_OUTPUT_WIDTH > 0
        assert DEFAULT_OUTPUT_HEIGHT > 0
        # 默认是竖屏 1080x1920
        assert DEFAULT_OUTPUT_WIDTH == 1080
        assert DEFAULT_OUTPUT_HEIGHT == 1920


class TestRenderAdapterResult:
    """RenderAdapterResult 数据结构测试."""

    def test_failure_defaults(self):
        """失败结果默认值."""
        result = RenderAdapterResult(success=False)
        assert result.success is False
        assert result.output_url == ""
        assert result.output_path is None
        assert result.thumbnail_url == ""
        assert result.duration == 0.0
        assert result.file_size == 0
        assert result.width == 0
        assert result.height == 0

    def test_success_with_values(self):
        """成功结果带完整值."""
        result = RenderAdapterResult(
            success=True,
            output_url="https://example.com/output.mp4",
            output_path=Path("/tmp/output.mp4"),
            thumbnail_url="https://example.com/thumb.jpg",
            duration=30.5,
            file_size=1024000,
            width=1080,
            height=1920,
        )
        assert result.success is True
        assert result.output_url == "https://example.com/output.mp4"
        assert result.output_path == Path("/tmp/output.mp4")
        assert result.thumbnail_url == "https://example.com/thumb.jpg"
        assert result.duration == pytest.approx(30.5)
        assert result.file_size == 1024000
        assert result.width == 1080
        assert result.height == 1920
