// Package protocol defines the wire format shared between the control plane
// and agents. Keep this small — anything that goes over HTTP or WebSocket
// between us and an agent lives here.
package protocol

// Event is what an agent streams back to the control plane over its outbound
// WebSocket. The control plane fans these out to dashboard clients and
// persists them (log lines to .log, progress snapshots to SQLite).
type Event struct {
	DeploymentID string `json:"deploymentId"`
	Kind         string `json:"kind"`   // progress | log | status
	State        string `json:"state,omitempty"` // QUEUED, FETCHING, ... RUNNING, FAILED, STOPPED
	Stage        string `json:"stage,omitempty"` // human label, e.g. "git fetch"
	Line         string `json:"line,omitempty"`  // log line (for kind=log)
	ContainerID  string `json:"containerId,omitempty"`
	At           int64  `json:"at"` // unix millis
}

// DeployRequest is what the control plane POSTs to an agent to start work.
// Credentials are passed per-operation; agents MUST NOT log or persist them.
type DeployRequest struct {
	DeploymentID string            `json:"deploymentId"`
	SandboxID    string            `json:"sandboxId,omitempty"` // owning sandbox (Slice 2)
	Repository   string            `json:"repository"`   // name from agent's repo config
	Branch       string            `json:"branch"`
	HostPort     int               `json:"hostPort,omitempty"` // host port to bind the container to
	Env          map[string]string `json:"env,omitempty"`      // injected into container
	Username     string            `json:"username"`
	Password     string            `json:"password"`
}

// DeployResponse is the agent's immediate ack to a DeployRequest.
// Actual progress streams over the WS.
type DeployResponse struct {
	OK    bool   `json:"ok"`
	Error string `json:"error,omitempty"`
}

// RepoInfo describes one repository the agent knows about.
type RepoInfo struct {
	Name string `json:"name"`
	Path string `json:"path"`
	// DefaultBranch is best-effort; empty if the repo is empty or unreadable.
	DefaultBranch string `json:"defaultBranch,omitempty"`
}

// RouteOverride is a single "<service>_url" line the gateway agent should
// rewrite in the API gateway's config.php. The key is the PHP array key
// (e.g. "haven_url"); the value is the new URL (e.g.
// "http://172.18.136.92:9001"). TargetOCP=true means "leave it alone /
// point back at the OCP URL"; in that case the agent should restore the
// original value from its snapshot.
type RouteOverride struct {
	Key        string `json:"key"`        // e.g. "haven_url"
	Value      string `json:"value"`      // new URL, e.g. "http://172.18.136.92:9001"
	TargetOCP  bool   `json:"targetOcp"`  // if true, restore OCP URL from snapshot
}
