File size: 3,171 Bytes
ee62336
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"""Criminal case data models."""

from dataclasses import dataclass, field
from typing import Literal


@dataclass
class Evidence:
    """A piece of evidence."""

    evidence_id: str
    type: str  # "physical", "testimonial", "documentary", "forensic"
    description: str
    strength_prosecution: float  # 0.0-1.0
    strength_defense: float  # 0.0-1.0
    contestable: bool = False
    contest_reason: str | None = None

    def get_summary(self) -> str:
        """Get a brief summary of the evidence."""
        return f"[{self.type.upper()}] {self.description}"


@dataclass
class Witness:
    """A witness in the case."""

    witness_id: str
    name: str
    role: str  # "eyewitness", "expert", "character", etc.
    testimony_summary: str
    credibility_issues: list[str] = field(default_factory=list)
    side: Literal["prosecution", "defense", "neutral"] = "neutral"

    def get_summary(self) -> str:
        """Get a brief summary of the witness."""
        return f"{self.name} ({self.role}): {self.testimony_summary}"


@dataclass
class Defendant:
    """The defendant in the case."""

    name: str
    age: int | None = None
    occupation: str | None = None
    background: str = ""
    prior_record: list[str] = field(default_factory=list)


@dataclass
class CriminalCase:
    """A criminal case for deliberation."""

    case_id: str
    title: str
    summary: str  # 2-3 paragraph overview

    # Charges
    charges: list[str] = field(default_factory=list)

    # Evidence
    evidence: list[Evidence] = field(default_factory=list)

    # Witnesses
    witnesses: list[Witness] = field(default_factory=list)

    # Arguments
    prosecution_arguments: list[str] = field(default_factory=list)
    defense_arguments: list[str] = field(default_factory=list)

    # Defendant
    defendant: Defendant | None = None

    # Metadata
    difficulty: Literal["clear_guilty", "clear_innocent", "ambiguous"] = "ambiguous"
    themes: list[str] = field(default_factory=list)

    # For display
    year: int = 2024
    jurisdiction: str = "United States"

    def get_evidence_summary(self) -> str:
        """Get formatted summary of all evidence."""
        if not self.evidence:
            return "No evidence available."
        return "\n".join(f"- {e.get_summary()}" for e in self.evidence)

    def get_witness_summary(self) -> str:
        """Get formatted summary of all witnesses."""
        if not self.witnesses:
            return "No witnesses available."
        return "\n".join(f"- {w.get_summary()}" for w in self.witnesses)

    def get_charges_text(self) -> str:
        """Get formatted list of charges."""
        if not self.charges:
            return "No charges specified."
        return ", ".join(self.charges)

    def to_dict(self) -> dict:
        """Convert to dictionary for serialization."""
        return {
            "case_id": self.case_id,
            "title": self.title,
            "summary": self.summary,
            "charges": self.charges,
            "difficulty": self.difficulty,
            "themes": self.themes,
            "year": self.year,
            "jurisdiction": self.jurisdiction,
        }