"""Duplicate ticket detection helpers."""

from __future__ import annotations

from dataclasses import dataclass
from typing import List, Optional

from packages.integrations.jira import JiraIssue


@dataclass
class DuplicateCheckResult:
    is_duplicate: bool
    original_key: Optional[str] = None
    rationale: str = ""
    confidence: float = 0.0


def candidate_search_jql(project_key: str, current_key: str) -> str:
    project = (project_key or "").strip() or current_key.split("-")[0]
    return f'project = "{project}" AND key != {current_key} ORDER BY updated DESC'


def duplicate_review_comment_body(original_key: str, rationale: str = "") -> str:
    lines = [
        "## Agent Nova possible duplicate detected",
        "",
        f"This ticket looks like a duplicate of **{original_key}**.",
        "",
        f"Original / main ticket: {original_key}",
    ]
    if rationale.strip():
        lines.extend(["", f"Reason: {rationale.strip()}"])
    lines.extend(
        [
            "",
            "Next step: reply with `continue` to proceed anyway, or `duplicate` / "
            "`close as duplicate` to stop this run.",
        ]
    )
    return "\n".join(lines)


def build_duplicate_check_prompt(issue: JiraIssue, candidates: List[JiraIssue]) -> str:
    lines = [
        "Decide whether the NEW Jira ticket is a duplicate of any CANDIDATE ticket.",
        "A duplicate means the same Salesforce work request (same object/field/behavior intent),",
        "not merely the same project or a loosely related idea.",
        "If none are duplicates, set is_duplicate=false and leave original_key empty.",
        "",
        "NEW ticket:",
        f"Key: {issue.key}",
        f"Summary: {issue.summary}",
        f"Description: {issue.description[:2000]}",
        "",
        "CANDIDATES:",
    ]
    if not candidates:
        lines.append("(none)")
    for c in candidates:
        lines.extend(
            [
                f"- Key: {c.key}",
                f"  Summary: {c.summary}",
                f"  Description: {(c.description or '')[:800]}",
                f"  Status: {c.status}",
            ]
        )
    return "\n".join(lines)
