/*
 * "Copiar estilo" (o pincel de formato): o que passa de uma peça para outra.
 * Entre peças do mesmo tipo vai o visual inteiro (cor, fonte, borda, sombra,
 * efeitos), nunca o conteúdo nem o lugar (texto, foto, posição, tamanho da
 * caixa). Entre tipos diferentes vai o que os dois têm: transparência,
 * transparência em degradê e sombra.
 */
import type { Peca } from "./documento";

const COMUNS = ["opacidade", "transparencia"] as const;

const POR_TIPO: Record<Peca["tipo"], readonly string[]> = {
  texto: ["fonte", "tamanho", "peso", "pintura", "alinhamento", "vertical", "italico", "caixaAlta", "riscado", "sublinhado", "espaco", "linha", "fundo", "contorno", "sombra", "curva", "destaque", "efeito", "lista"],
  forma: ["pintura", "raio", "borda", "sombra", "pontas", "profundidade"],
  imagem: ["raio", "circulo", "borda", "sombra", "filtros", "duotone", "adesivo", "desvanecer", "mascara"],
  icone: ["pintura", "espessura", "preenchido", "sombra"],
  textura: ["estilo", "cor", "quantidade", "tamanho", "giro"],
  traco: ["cor", "espessura", "tracejado", "inicio", "fim", "suave", "preenchimento", "sombra"],
  qr: ["cor", "fundo", "arredondado"],
  tabela: ["fonte", "tamanho", "corDoTexto", "cabecalho", "corDoCabecalho", "corDoTextoDoCabecalho", "corDaLinha", "corDaLinha2", "corDaBorda", "alinhamento", "raio"],
  grafico: ["estilo", "cores", "fonte", "corDoTexto", "mostrarValores", "prefixo", "sufixo"],
};

/** Os campos que o alvo recebe da peça de origem. */
export function estiloPara(origem: Peca, alvo: Peca): Partial<Peca> {
  const de = origem as unknown as Record<string, unknown>;
  const campos: Record<string, unknown> = {};
  for (const chave of COMUNS) campos[chave] = de[chave] ?? undefined;
  if (origem.tipo === alvo.tipo) {
    for (const chave of POR_TIPO[origem.tipo]) if (chave in de) campos[chave] = structuredClone(de[chave]);
    /* Texto com trechos formatados: o estilo novo vale para o texto inteiro. */
    if (alvo.tipo === "texto") campos.html = null;
  } else if ("sombra" in alvo && "sombra" in origem) campos.sombra = structuredClone(de.sombra);
  return campos as Partial<Peca>;
}
