/**
 * Tipos do cofre de chaves (`exchange_accounts`).
 *
 * Convenções:
 * - `*Row` espelha a linha do banco (com colunas `*_enc` como Buffer).
 * - `*Public` é o que sai pro frontend/API: NUNCA contém o secret nem a
 *   senha de proxy — só metadados e os últimos 4 dígitos do secret.
 * - `*Input` são os dados de entrada do CRUD (com segredos em claro, que a
 *   camada de repositório criptografa antes de gravar).
 */

export type Exchange = "binance" | "bybit";
export type ProxyProtocol = "http" | "https" | "socks5";

/** Linha crua de `exchange_accounts` (como volta do MySQL). */
export interface ExchangeAccountRow {
  id: number;
  label: string;
  exchange: Exchange;
  api_key: string;
  api_secret_enc: Buffer;
  binance_user_id: string | null;
  proxy_enabled: number;
  proxy_protocol: ProxyProtocol | null;
  proxy_host: string | null;
  proxy_port: number | null;
  proxy_user: string | null;
  proxy_pass_enc: Buffer | null;
  active: number;
  created_at: Date;
  updated_at: Date;
}

/** Config de proxy de entrada (segredo em claro). */
export interface ProxyInput {
  enabled: boolean;
  protocol: ProxyProtocol;
  host: string;
  port: number;
  user?: string | null;
  /** Senha em claro; será criptografada. */
  pass?: string | null;
}

export interface CreateAccountInput {
  label: string;
  exchange: Exchange;
  apiKey: string;
  /** Secret em claro; será criptografado. */
  apiSecret: string;
  binanceUserId?: string | null;
  proxy?: ProxyInput | null;
  active?: boolean;
}

/**
 * Atualização parcial. Campos ausentes não mudam. `apiSecret` só é
 * regravado se vier preenchido (edição substitui; nunca revela o atual).
 * `proxy = null` remove o proxy; `proxy.pass` ausente mantém a senha atual.
 */
export interface UpdateAccountInput {
  label?: string;
  apiKey?: string;
  apiSecret?: string;
  binanceUserId?: string | null;
  proxy?: ProxyInput | null;
  active?: boolean;
}

/** Visão pública (sem segredos) — segura para devolver na API. */
export interface ExchangeAccountPublic {
  id: number;
  label: string;
  exchange: Exchange;
  apiKey: string;
  apiSecretLast4: string;
  binanceUserId: string | null;
  proxy: {
    enabled: boolean;
    protocol: ProxyProtocol | null;
    host: string | null;
    port: number | null;
    user: string | null;
    hasPassword: boolean;
  } | null;
  active: boolean;
  createdAt: Date;
  updatedAt: Date;
}
