import { Request, Response } from 'express';
import { MqttClient } from 'mqtt';
import { ServerAPI, Plugin, Delta, Update, PathValue, Context, Path, Timestamp } from '@signalk/server-api';
export type SignalKApp = ServerAPI;
export type SignalKDelta = Delta;
export type SignalKUpdate = Update;
export type SignalKValue = PathValue;
export type SignalKContext = Context;
export type SignalKPath = Path;
export type SignalKTimestamp = Timestamp;
export interface SignalKPlugin extends Plugin {
    config?: MQTTExportConfig;
}
export interface MQTTExportConfig {
    enabled: boolean;
    mqttBroker: string;
    mqttClientId: string;
    mqttUsername: string;
    mqttPassword: string;
    topicPrefix: string;
    exportRules: ExportRule[];
}
export interface ExportRule {
    id: string;
    name: string;
    context: string;
    path: string;
    source?: string;
    sourceLabel?: string;
    enabled: boolean;
    period: number;
    qos: number;
    retain: boolean;
    payloadFormat: PayloadFormat;
    sendOnChange: boolean;
    topicTemplate?: string;
    excludeMMSI?: string;
}
export type PayloadFormat = 'full' | 'value-only';
export interface PluginState {
    mqttClient: MqttClient | null;
    exportRules: ExportRule[];
    activeSubscriptions: Map<string, ExportRule[]>;
    lastSentValues: Map<string, unknown>;
    currentConfig?: MQTTExportConfig;
    unsubscribes: (() => void)[];
}
export interface MQTTClientOptions {
    clientId: string;
    clean: boolean;
    reconnectPeriod: number;
    keepalive: number;
    username?: string;
    password?: string;
}
export interface TypedRequest<T = unknown> extends Request {
    body: T;
}
export interface TypedResponse<T = unknown> extends Response {
    json: (obj: T) => this;
}
export interface ApiResponse {
    success: boolean;
    message?: string;
    error?: string;
    topic?: string;
}
export interface RulesApiResponse extends ApiResponse {
    rules: ExportRule[];
    activeSubscriptions: number;
    mqttConnected: boolean;
}
export interface MQTTStatusApiResponse extends ApiResponse {
    connected: boolean;
    broker?: string;
    clientId?: string;
}
export interface RuleUpdateRequest {
    rules: ExportRule[];
}
export interface DefaultRuleConfig {
    id: string;
    name: string;
    context: string;
    path: string;
    source: string;
    enabled: boolean;
    period: number;
    qos: number;
    retain: boolean;
    payloadFormat: PayloadFormat;
    sendOnChange: boolean;
    excludeMMSI?: string;
}
export interface MqttPublishResult {
    topic: string;
    payload: string;
    rule: ExportRule;
    success: boolean;
    error?: string;
}
export interface ContextGroup {
    context: string;
    rules: ExportRule[];
}
export interface ValueChangeResult {
    hasChanged: boolean;
    currentValue: unknown;
    previousValue?: unknown;
}
export interface TopicTemplateVariables {
    context: string;
    path: string;
    source?: string;
}
export interface RuleValidationResult {
    isValid: boolean;
    errors: string[];
}
export interface PluginStats {
    totalRules: number;
    enabledRules: number;
    activeSubscriptions: number;
    mqttConnected: boolean;
    messagesPublished: number;
    lastPublishTime?: string;
}
export type MqttConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
export interface SubscriptionError {
    context: string;
    path: string;
    error: string;
}
export interface RuleProcessingResult {
    rule: ExportRule;
    matched: boolean;
    published: boolean;
    topic?: string;
    payload?: string;
    error?: string;
}
