/*
  As observações do pedido.

  O orçamento tem "Observações para o cliente" (quotes.notes), mas a aprovação
  nunca as levou para o pedido: quem produz e quem fatura não via o que foi
  combinado, e a nota fiscal saía só com "Pedido 84".

  Em vez de mexer nas funções do banco que criam o pedido, o pedido HERDA a
  observação do orçamento enquanto ninguém escrever a dele — do mesmo jeito
  que já acontece com o prazo de entrega. A diferença entre "nunca mexeram" e
  "apagaram de propósito" mora no banco:

    orders.notes NULL  -> vale a do orçamento;
    orders.notes ""    -> apagada no pedido, não volta a do orçamento;
    orders.notes "..." -> a do pedido.

  É este texto que vai para as informações complementares da nota fiscal.
*/

export const LIMITE_DAS_OBSERVACOES = 1500;

/*
  Textos que o próprio sistema escreve no campo quando ninguém escreveu nada.
  O balcão grava "Venda originada no PDV." em todo orçamento sem observação
  (2.265 deles em 18/09/2026), e o portal do cliente e a loja têm os seus. Não
  são observação de ninguém: não aparecem no pedido e, principalmente, não vão
  parar no cupom fiscal de cada venda do balcão.
*/
const TEXTOS_DO_SISTEMA = [
  /^venda originada no pdv\.?$/i,
  /^venda no balc[ãa]o\.?$/i,
  /^pedido feito pela loja virtual\.?$/i,
  /^cadastro criado automaticamente\b/i,
];

export function ehTextoDoSistema(texto: string) {
  const limpo = texto.trim();
  return TEXTOS_DO_SISTEMA.some((padrao) => padrao.test(limpo));
}

export type ObservacoesDoPedido = {
  texto: string;
  /** Veio do orçamento: o pedido ainda não tem a dele. */
  doOrcamento: boolean;
};

type ComNotas = { notes?: string | null } | null | undefined;

export function observacoesDoPedido(pedido: ComNotas, orcamento?: ComNotas): ObservacoesDoPedido {
  const propria = pedido?.notes;
  if (typeof propria === "string" && !ehTextoDoSistema(propria)) return { texto: propria.trim(), doOrcamento: false };
  const herdada = typeof orcamento?.notes === "string" && !ehTextoDoSistema(orcamento.notes) ? orcamento.notes.trim() : "";
  return { texto: herdada, doOrcamento: herdada.length > 0 };
}

/** O que a tela manda gravar: quebras de linha iguais, sem sobra nas pontas, no limite. */
export function normalizarObservacoes(bruto: unknown): string {
  return String(bruto ?? "")
    .replace(/\r\n?/g, "\n")
    .replace(/[ \t]+\n/g, "\n")
    .replace(/\n{3,}/g, "\n\n")
    .trim()
    .slice(0, LIMITE_DAS_OBSERVACOES)
    .trim();
}
