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?: MQTTImportConfig;
}
export interface MQTTImportConfig {
    enabled: boolean;
    mqttBroker: string;
    mqttClientId: string;
    mqttUsername: string;
    mqttPassword: string;
    topicPrefix: string;
}
export interface ImportRule {
    id: string;
    name: string;
    mqttTopic: string;
    signalKContext: string;
    signalKPath: string;
    sourceLabel: string;
    enabled: boolean;
    payloadFormat: 'full' | 'value-only';
    ignoreDuplicates: boolean;
    excludeMMSI?: string;
    transformValue?: (value: any) => any;
}
export interface MQTTConnectionStatus {
    connected: boolean;
    broker: string;
    clientId: string;
}
export interface MQTTMessage {
    topic: string;
    payload: string;
    timestamp: string;
}
export interface ApiResponse<T = any> {
    success: boolean;
    data?: T;
    error?: string;
    message?: string;
}
export interface RulesApiResponse extends ApiResponse {
    rules?: ImportRule[];
    mqttConnected?: boolean;
}
export interface MQTTStatusApiResponse extends ApiResponse {
    connected?: boolean;
    broker?: string;
    clientId?: string;
}
export interface StatsApiResponse extends ApiResponse {
    stats?: {
        totalRules: number;
        enabledRules: number;
        messagesReceived: number;
        mqttConnected: boolean;
    };
}
export interface TypedRequest<T = any> extends Request {
    body: T;
    params: {
        [key: string]: string;
    };
    query: {
        [key: string]: string;
    };
}
export interface TypedResponse<T = any> extends Response {
    json: (body: T) => this;
    status: (code: number) => this;
}
export interface PluginState {
    mqttClient: MqttClient | null;
    importRules: ImportRule[];
    lastReceivedMessages: Map<string, number>;
    selfVesselUrn: string | null;
    rulesFilePath: string | null;
    currentConfig?: MQTTImportConfig;
}
export interface MQTTClientOptions {
    clientId: string;
    clean: boolean;
    reconnectPeriod: number;
    keepalive: number;
    username?: string;
    password?: string;
}
export interface TopicParseResult {
    context: string;
    path: string;
    vesselId?: string;
    mmsi?: string;
}
export interface MessageProcessingResult {
    signalKData: SignalKDelta | null;
    processed: boolean;
    error?: string;
}
export interface RuleMatchResult {
    rule: ImportRule | null;
    matches: boolean;
    excluded: boolean;
    reason?: string;
}
export type PayloadFormat = 'full' | 'value-only';
export type MessageKey = string;
export interface PluginError extends Error {
    code?: string;
    details?: any;
}
export interface VesselUrn {
    full: string;
    mqtt: string;
    mmsi: string;
    isSelf: boolean;
}
export interface RuleUpdateRequest {
    rules: ImportRule[];
}
export interface ImportStats {
    totalRules: number;
    enabledRules: number;
    messagesReceived: number;
    mqttConnected: boolean;
    topicsSubscribed: number;
    lastMessageTime?: string;
}
export interface DefaultRuleConfig {
    id: string;
    name: string;
    mqttTopic: string;
    enabled: boolean;
    payloadFormat: PayloadFormat;
    ignoreDuplicates: boolean;
}
export interface MessageCache {
    key: string;
    timestamp: number;
    count: number;
}
export interface TopicSubscription {
    topic: string;
    qos: number;
    ruleIds: string[];
}
export interface ContextExtractionResult {
    context: string;
    path: string;
    vesselId: string;
    isSelfVessel: boolean;
}
export interface MMSIExclusionResult {
    excluded: boolean;
    mmsi: string | null;
    reason?: string;
}
export interface RuleValidationResult {
    valid: boolean;
    errors: string[];
    warnings: string[];
}
export interface PersistentStorage {
    filePath: string;
    lastModified: number;
    rules: ImportRule[];
}
//# sourceMappingURL=types.d.ts.map