"""Title-based WIP matcher (task #1458) — pure unit tests for
``matches_wip_title``, the precision-first heuristic that decides whether a post
title explicitly declares work-in-progress. No DB, no network.

Precision matters more than recall here: a false positive applies the ``wip``
system tag, which HIDES a finished post from the Explore browse — so the
negative cases (substrings like ``swipe`` / ``wiped``) are the load-bearing ones.
"""
import pytest

from backend.app.services.wip_title import matches_soft_wip_title, matches_wip_title


@pytest.mark.parametrize("title", [
    "WIP",
    "wip",
    "WiP",
    "Nami Heroines - WIP Part 1",   # the real-world example from the gate work
    "sketch (WIP)",
    "[WIP] new piece",
    "WIP: colour test",
    "cool art WIP2",                # trailing digit = "WIP part 2", still WIP
    "W.I.P.",
    "W.I.P",
    "work in progress",
    "Work In Progress",
    "commission work-in-progress",
    "big_project_work_in_progress",
    "final touches, wip",
])
def test_matches_positive(title):
    assert matches_wip_title(title) is True


@pytest.mark.parametrize("title", [
    None,
    "",
    "a quick swipe left",           # 'wip' inside swipe — must NOT match
    "she wiped the counter",        # wiped
    "wiping down the desk",         # wiping
    "unwiped surface",
    "progressive rock cover",       # 'progress' inside progressive, no 'work in'
    "workin on it",                 # not the full phrase
    "finished at last",
    "Kawips diner",                 # 'wip' mid-word
    "swipright",
    "quick sketch of Nami",         # soft cue — NOT a HARD WIP match
])
def test_matches_negative(title):
    assert matches_wip_title(title) is False


@pytest.mark.parametrize("title", [
    "quick sketch",
    "Nami sketch",
    "morning doodle",
    "some doodles",
    "sketches from today",
    "a little scribble",
    "SKETCH",
])
def test_soft_matches_positive(title):
    assert matches_soft_wip_title(title) is True


@pytest.mark.parametrize("title", [
    None,
    "",
    "sketchbook tour",              # 'sketch' inside sketchbook — must NOT match
    "kadoodle mascot",              # 'doodle' mid-word
    "the final piece",
    "WIP",                          # a HARD cue is not a SOFT cue
    "prescribed colours",           # 'scrib' inside prescribed — must NOT match
])
def test_soft_matches_negative(title):
    assert matches_soft_wip_title(title) is False
