/* Objeto e não `enum`: os testes rodam no `node --test`, que lê TypeScript
   tirando os tipos e não sabe montar enum. O uso é o mesmo (StatusPedido.X). */
export const StatusPedido = {
  AGUARDANDO: "AGUARDANDO",
  PRODUCAO: "PRODUCAO",
  PRONTO: "PRONTO",
  ENVIADO: "ENVIADO",
  FINALIZADO: "FINALIZADO",
  CANCELADO: "CANCELADO",
} as const;
export type StatusPedido = (typeof StatusPedido)[keyof typeof StatusPedido];

export type XbzCredentials = {
  cnpj: string;
  token: string;
};

export type XbzFornecedor = {
  id: string;
  integrationId: string;
  ownerId: string;
  cnpj: string;
  token: string;
  createdAt: string;
  updatedAt: string;
};

export type XbzTransportadora = {
  idXbz: number;
  nome: string;
  tipo: 30 | 40;
};

export type XbzPedidoRecord = {
  id: string;
  fornecedorId: string;
  pedidoLocalId: string | null;
  numeroXbz: string | null;
  statusXbz: string | null;
  statusMapeado: StatusPedido | null;
  valorTotal: number | null;
  payloadEnvio: Record<string, unknown>;
  payloadRetorno: Record<string, unknown>;
  createdAt: string;
  updatedAt: string;
};

export type XbzLogAction =
  | "saveCredentials"
  | "testConnection"
  | "syncAuxiliary"
  | "searchProducts"
  | "syncCatalogo"
  | "importProduct"
  | "createOrder"
  | "listOrders"
  | "cancelOrder"
  | "syncPedidosXbz"
  | "legacyMigration";

export type XbzLogRecord = {
  fornecedorId: string;
  action: XbzLogAction | string;
  payload: Record<string, unknown>;
  response: Record<string, unknown>;
  createdAt?: string;
};

export type XbzApiActionBody =
  | { action: "saveCredentials"; cnpj: string; token: string }
  | { action: "testConnection" }
  | { action: "syncAuxiliary" }
  | { action: "searchProducts"; busca: string }
  | { action: "refreshCatalog" }
  | { action: "catalogStatus" }
  | {
      action: "importProduct";
      /* O código do modelo na XBZ (o "amigável", 06520). */
      modelo: string;
      /* Os códigos XBZ das cores que entram; vazio = todas. */
      cores?: string[];
      /* Quanto somar ao preço da XBZ para vender, em %. */
      margem: number;
      nome?: string;
    }
  | {
      action: "createOrder";
      pedidoLocalId?: string;
      ordemDeCompra: string;
      pagamentoTipoId: number;
      entregaTipoId: number;
      entregaTransportadoraGravacaoId?: number | null;
      produtoCodigoXbz: string;
      quantidade: number;
      detalhes?: string;
    }
  | {
      action: "listOrders";
      qtd_dias: number;
      exibir_finalizados: boolean;
      exibir_cancelados: boolean;
      pedido_numero?: string;
    }
  | { action: "cancelOrder"; numero: string }
  | { action: "migrateLegacyData" };
