from tasks.base import Task, GroundTruth


class RipgrepTraitImplementorsTask(Task):
    @property
    def name(self) -> str:
        return "rg_trait_implementors"

    @property
    def repo(self) -> str:
        return "ripgrep"

    @property
    def prompt(self) -> str:
        return (
            "Find the `Matcher` trait definition in the matcher crate. "
            "Then find all types that implement this trait. For each implementor, "
            "show where it is defined and what crate it lives in."
        )

    @property
    def ground_truth(self) -> GroundTruth:
        return GroundTruth(
            required_strings=["Matcher", "find_at", "RegexMatcher"],
        )

    @property
    def task_type(self) -> str:
        return "navigate"


class RipgrepFlagDefinitionTask(Task):
    @property
    def name(self) -> str:
        return "rg_flag_definition"

    @property
    def repo(self) -> str:
        return "ripgrep"

    @property
    def prompt(self) -> str:
        return (
            "In crates/core/flags/defs.rs, find the implementation of the --type-list flag. "
            "Show the complete Flag trait implementation for this flag, including all methods."
        )

    @property
    def ground_truth(self) -> GroundTruth:
        return GroundTruth(
            required_strings=["TypeList", "impl Flag for", "name_long", "type-list"],
        )


class RipgrepSearchDispatchTask(Task):
    @property
    def name(self) -> str:
        return "rg_search_dispatch"

    @property
    def repo(self) -> str:
        return "ripgrep"

    @property
    def prompt(self) -> str:
        return (
            "Explain how ripgrep dispatches between single-line and multi-line search. "
            "Trace the code path from the Searcher to the actual matching logic. "
            "What structs are involved, which files contain them, and how do the "
            "generic type parameters flow?"
        )

    @property
    def ground_truth(self) -> GroundTruth:
        return GroundTruth(
            required_strings=["ReadByLine", "MultiLine", "Sink", "glue.rs"],
        )

    @property
    def task_type(self) -> str:
        return "navigate"


class RipgrepWalkerParallelTask(Task):
    @property
    def name(self) -> str:
        return "rg_walker_parallel"

    @property
    def repo(self) -> str:
        return "ripgrep"

    @property
    def prompt(self) -> str:
        return (
            "In the ignore crate, find the parallel directory walker. Show the WalkParallel "
            "struct, the ParallelVisitor trait, and explain how work is distributed across threads."
        )

    @property
    def ground_truth(self) -> GroundTruth:
        return GroundTruth(
            required_strings=["WalkParallel", "ParallelVisitor", "ParallelVisitorBuilder"],
        )

    @property
    def task_type(self) -> str:
        return "navigate"


class RipgrepLineIterDefinitionTask(Task):
    @property
    def name(self) -> str:
        return "rg_lineiter_definition"

    @property
    def repo(self) -> str:
        return "ripgrep"

    @property
    def prompt(self) -> str:
        return (
            "Find the LineIter struct definition in the ripgrep codebase. "
            "Show the struct and its fields, and explain what it's used for."
        )

    @property
    def ground_truth(self) -> GroundTruth:
        return GroundTruth(
            required_strings=["LineIter", "bytes"],
        )


class RipgrepLineIterUsageTask(Task):
    @property
    def name(self) -> str:
        return "rg_lineiter_usage"

    @property
    def repo(self) -> str:
        return "ripgrep"

    @property
    def prompt(self) -> str:
        return (
            "Find the LineIter struct in ripgrep's searcher crate. Show its "
            "definition, then find where LineIter is constructed (look for "
            "LineIter::new or LineIter { calls). Show 2-3 key call sites."
        )

    @property
    def ground_truth(self) -> GroundTruth:
        return GroundTruth(
            required_strings=["LineIter", "lines.rs", "new"],
        )

    @property
    def task_type(self) -> str:
        return "navigate"
