import { z } from "zod";
import { ColumnMapping } from "../repositories/contact-import-jobs-repository";

export interface MappedContactRow {
  email: string;
  name?: string;
  phone?: string;
  tags: string[];
}

export type MapImportRowResult =
  | { valid: true; data: MappedContactRow }
  | { valid: false; error: string };

const emailSchema = z.string().trim().toLowerCase().email();

/**
 * Aplica o de/para de colunas (`ColumnMapping`, escolhido pelo usuário na etapa de mapeamento) a
 * uma linha crua do arquivo, validando o e-mail. Função pura para ser testada isoladamente sem
 * precisar de banco — cobre linha válida, e-mail inválido e linha vazia.
 */
export function mapImportRow(rawData: Record<string, string>, mapping: ColumnMapping): MapImportRowResult {
  const emailRaw = rawData[mapping.email]?.trim();
  if (!emailRaw) {
    return { valid: false, error: "E-mail vazio" };
  }

  const emailResult = emailSchema.safeParse(emailRaw);
  if (!emailResult.success) {
    return { valid: false, error: `E-mail inválido: ${emailRaw}` };
  }

  const name = mapping.name ? rawData[mapping.name]?.trim() || undefined : undefined;
  const phone = mapping.phone ? rawData[mapping.phone]?.trim() || undefined : undefined;
  const tagsRaw = mapping.tags ? rawData[mapping.tags] : undefined;
  const tags = tagsRaw
    ? tagsRaw
        .split(/[,;]/)
        .map((tag) => tag.trim())
        .filter(Boolean)
    : [];

  return { valid: true, data: { email: emailResult.data, name, phone, tags } };
}
