export type Protocol = 'TCP' | 'UDP';
export type ProfileItemType = 'process' | 'folder' | 'exe';
export type TargetKind = 'local' | 'external';
export type ProxyProtocol = 'socks5' | 'http';
export type ComponentId = 'control-app' | 'proxyfier' | 'singbox';
export type ComponentState = 'installed' | 'missing' | 'stopped' | 'running' | 'error';
export type ActivityLevel = 'info' | 'warning' | 'error' | 'success';

export interface ProfileItemInput {
  type: ProfileItemType | string;
  value: string;
  recursive?: boolean;
}

export interface ProfileInput {
  id?: string;
  name: string;
  enabled?: boolean;
  targetId?: string;
  protocols?: string[];
  items?: ProfileItemInput[];
}

export interface ProfileItem {
  type: ProfileItemType;
  value: string;
  recursive: boolean;
}

export interface Profile {
  id: string;
  name: string;
  enabled: boolean;
  targetId: string;
  protocols: Protocol[];
  items: ProfileItem[];
}

export interface TargetInput {
  id?: string;
  name: string;
  kind?: TargetKind | string;
  protocol?: ProxyProtocol | string;
  host: string;
  port: number;
  requiresComponent?: ComponentId | string;
}

export interface Target {
  id: string;
  name: string;
  kind: TargetKind;
  protocol: ProxyProtocol;
  host: string;
  port: number;
  requiresComponent?: ComponentId;
}

export interface ComponentStatus {
  id: ComponentId;
  name: string;
  state: ComponentState;
  installed: boolean;
  running: boolean;
  version?: string;
  path?: string;
  problems: string[];
  actions: string[];
}

export interface LocalSingBoxConfig {
  subscriptionDisplayUrl?: string;
  hasSubscription: boolean;
  selectedServerTag?: string;
  listenHost: string;
  listenPort: number;
  serviceName: string;
  installRoot: string;
  updatedAt?: string;
}

export interface SubscriptionServer {
  tag: string;
  type: string;
  server: string;
  serverPort: number;
}

export interface SubscriptionCache {
  servers: SubscriptionServer[];
  userInfo: Record<string, number | string | boolean | null>;
  fetchedAt: string;
}

export interface ActivityEntry {
  id: string;
  at: string;
  level: ActivityLevel;
  title: string;
  message: string;
}
