"""PeerDrop Core — Data models."""

from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
import uuid


class TransferStatus(Enum):
    """Status of a file transfer."""

    PENDING = "pending"
    CONNECTING = "connecting"
    TRANSFERRING = "transferring"
    COMPLETED = "completed"
    FAILED = "failed"
    CANCELLED = "cancelled"


@dataclass
class Peer:
    """A discovered peer on the network."""

    peer_id: str
    addrs: list[str]
    name: str = ""
    last_seen: datetime = field(default_factory=datetime.now)
    is_online: bool = True


@dataclass
class Device:
    """This device's identity."""

    peer_id: str
    name: str
    listen_port: int
    created_at: datetime = field(default_factory=datetime.now)


@dataclass
class Transfer:
    """State of a file transfer."""

    transfer_id: str = field(default_factory=lambda: uuid.uuid4().hex[:12])
    file_path: str = ""
    file_name: str = ""
    file_size: int = 0
    root_cid: str = ""
    sender_peer_id: str = ""
    receiver_peer_id: str = ""
    status: TransferStatus = TransferStatus.PENDING
    progress: float = 0.0
    bytes_sent: int = 0
    started_at: datetime | None = None
    completed_at: datetime | None = None
    error: str | None = None


@dataclass
class TransferRequest:
    """Stream handshake message sent from sender to receiver."""

    file_name: str
    file_size: int
    root_cid: str
    sender_peer_id: str


@dataclass
class Message:
    """A pubsub message received on a topic."""

    topic: str
    sender: str
    data: str
    timestamp: datetime = field(default_factory=datetime.now)
