import { DESCRICAO_DO_CAMPO_DE_IMAGEM } from "../imagens";
import type { Campo } from "../esquema";
import { COBRAR_POR, OPCOES_DE_ESTILO } from "./produto-completo-regras";
import { VALOR_MAXIMO } from "./regras-do-produto";

/* Os campos que se repetem entre criar_produto e as ferramentas da ficha. */

export const CAMPO_DE_ATRIBUTOS: Campo = {
  tipo: "lista",
  descricao:
    'Os atributos (variações) do produto: Cor, Tamanho, Papel, Acabamento... Cada um com as opções e o adicional de preço de cada opção. Só o que você citar muda: atributo ou opção que já existe é achado pelo nome (sem diferença de maiúsculas); nome novo cria. Para tirar, mande remover: true. Ex.: [{"nome":"Cor","opcoes":[{"rotulo":"Azul","cor":"#1F5FD0"},{"rotulo":"Dourado","preco_adicional":5}]}].',
  maxItens: 20,
  itens: {
    nome: { tipo: "texto", descricao: "Nome do atributo (o atual, para mudar um que existe).", obrigatorio: true, max: 80 },
    novo_nome: { tipo: "texto", descricao: "Novo nome do atributo.", max: 80 },
    remover: { tipo: "booleano", descricao: "Tira o atributo inteiro (com as opções)." },
    multipla_escolha: { tipo: "booleano", descricao: "O cliente pode marcar várias opções (ex.: acabamentos)." },
    obrigatorio: { tipo: "booleano", descricao: "O cliente precisa escolher uma opção antes de comprar." },
    estilo: { tipo: "opcao", descricao: "Como a loja desenha as opções. automático = o sistema decide.", opcoes: OPCOES_DE_ESTILO },
    mostrar_na_loja: { tipo: "booleano", descricao: "Falso esconde o atributo da loja (fica só no painel e nos orçamentos)." },
    posicao: { tipo: "inteiro", descricao: "Posição do atributo na lista (1 = primeiro).", min: 1, max: 50 },
    opcoes: {
      tipo: "lista",
      descricao: "As opções deste atributo que mudam ou entram.",
      maxItens: 100,
      itens: {
        rotulo: { tipo: "texto", descricao: "Nome da opção (o atual, para mudar uma que existe).", obrigatorio: true, max: 120 },
        novo_rotulo: { tipo: "texto", descricao: "Novo nome da opção.", max: 120 },
        remover: { tipo: "booleano", descricao: "Tira a opção." },
        preco_adicional: {
          tipo: "numero",
          descricao: "Quanto a opção soma ao preço, em reais (pode ser negativo para desconto). Zero = sem adicional.",
          min: -VALOR_MAXIMO,
          max: VALOR_MAXIMO,
        },
        cobrar_por: {
          tipo: "opcao",
          descricao: 'Como o adicional é cobrado: "peça" (multiplica pela quantidade), "pedido" (uma vez só) ou "medida" (por m²/metro, só em produto vendido por medida).',
          opcoes: COBRAR_POR,
        },
        cor: { tipo: "texto", descricao: 'Cor da bolinha na loja, como #1F5FD0. "automática" deixa o sistema adivinhar pelo nome.', max: 12 },
        obrigatoria: { tipo: "booleano", descricao: "Opção sempre incluída (o cliente não consegue desmarcar)." },
        estoque_inicial: { tipo: "numero", descricao: "Saldo inicial (só para opção nova, com estoque por opção).", min: 0, max: 100_000_000 },
        estoque_minimo: { tipo: "numero", descricao: "Estoque mínimo da opção.", min: 0, max: 100_000_000 },
        ponto_de_reposicao: { tipo: "numero", descricao: "Ponto de reposição da opção.", min: 0, max: 100_000_000 },
        foto_numero: { tipo: "inteiro", descricao: "Número da foto da galeria que aparece ao escolher esta opção (1 = primeira). 0 tira o vínculo.", min: 0, max: 200 },
        foto_id: { tipo: "id", descricao: "Ou o id da foto da galeria (de ver_produto_completo)." },
        insumo_id: { tipo: "texto", descricao: "Id do insumo que esta opção consome (receita da opção). \"nenhum\" tira.", max: 40 },
        insumo_quantidade: { tipo: "numero", descricao: "Quanto do insumo a opção consome por peça.", min: 0, max: 1_000_000 },
        posicao: { tipo: "inteiro", descricao: "Posição da opção (1 = primeira).", min: 1, max: 500 },
      },
    },
  },
};

export const CAMPO_DE_FOTOS: Campo = {
  tipo: "lista",
  descricao: `As fotos (até 10). Cada uma: ${DESCRICAO_DO_CAMPO_DE_IMAGEM} Para foto achada na internet, mande o link direto da imagem (o endereço do arquivo, terminando em .jpg, .png, .webp...).`,
  maxItens: 10,
  itens: {
    imagem: { tipo: "texto", descricao: 'A imagem: "envio:...", link https:// direto da imagem, ou "produto:<id>".', obrigatorio: true, max: 2000 },
    principal: { tipo: "booleano", descricao: "Vira a foto principal (a capa nos cards e na loja)." },
    atributo: { tipo: "texto", descricao: "Opcional: o atributo da opção que mostra esta foto (ex.: Cor).", max: 80 },
    opcao: { tipo: "texto", descricao: "Opcional: a opção que mostra esta foto (ex.: Azul).", max: 120 },
  },
};
