import type { FieldDescription, FieldType } from "@arco/clarizen-lib";
import { isPickListField } from "./picklist.js";

const TYPE_EXAMPLES: Record<FieldType, string> = {
  Boolean: "true, false, sim, não",
  String: 'texto livre, ex: "Meu valor"',
  Integer: "número inteiro, ex: 42",
  Long: "número inteiro, ex: 42",
  Double: "número decimal, ex: 3.14",
  DateTime: "2026-06-09 ou 2026-06-09T14:30:00Z",
  Date: "2026-06-09",
  Entity: 'ID da entidade, ex: /User/abc-123 ou {"id":"/User/abc-123"}',
  Duration: '{"value":5,"unit":"Days"}',
  Money: '{"value":100,"currency":"BRL"}',
};

export function getFieldTypeExample(type: FieldType | undefined): string {
  if (!type) return "valor conforme o tipo do campo";
  return TYPE_EXAMPLES[type] ?? type;
}

export function formatFieldHint(field: FieldDescription): string {
  const type = field.type ?? "desconhecido";
  const lines: string[] = [];

  if (isPickListField(field)) {
    lines.push("Tipo: PickList (lista de opções)");
    lines.push("Escolha um valor na lista — não digite o nome exibido manualmente.");
    const refType = (field as { referencedEntities?: string[] }).referencedEntities?.[0];
    if (refType) {
      lines.push(`Opções carregadas de: ${refType}`);
    }
  } else {
    const example = getFieldTypeExample(field.type);
    lines.push(`Tipo: ${type}`);
    lines.push(`Exemplo: ${example}`);
  }

  if (field.nullable) {
    lines.push("Este campo aceita valor vazio (null) para limpar.");
  }
  if (field.maxLength) {
    lines.push(`Tamanho máximo: ${field.maxLength} caracteres`);
  }

  return lines.join("\n");
}

export function formatFieldOptionLabel(field: FieldDescription): string {
  const label = field.label?.trim() || field.name || "?";
  const name = field.name ?? "?";
  const presentation =
    field.presentationType === "PickList" ? "PickList" : (field.type ?? "?");
  return `${label} (${name}) — ${presentation}`;
}

export function isUpdatableField(field: FieldDescription): boolean {
  if (!field.name?.trim()) return false;
  if (field.updateable === false) return false;
  if (field.calculated === true) return false;
  if (field.createOnly === true) return false;
  if (field.internal === true) return false;
  return true;
}
