/* EmailValidator.jsx — Validacion de correos en dos capas:
 *   Capa 1: Lista negra de dominios desechables/spam (sin costo, instantanea)
 *   Capa 2: Abstract API — verifica que el correo exista de verdad
 *            (requiere API key; si no esta configurada, solo aplica Capa 1)
 * Exposed as window.EmailValidator
 */
const EmailValidator = (() => {

  // ── CONFIGURACION ──────────────────────────────────────────────────────────
  // La key se lee desde supabaseConfig.js para no exponerla en el codigo.
  // En supabaseConfig.js agrega: window.SUPABASE_CONFIG.zbKey = "tu-key-aqui";
  const ZEROBOUNCE_KEY = (window.SUPABASE_CONFIG && window.SUPABASE_CONFIG.zbKey) || null;

  // ── LISTA NEGRA DE DOMINIOS DESECHABLES / SPAM ────────────────────────────
  const DISPOSABLE = new Set([
    "mailinator.com","guerrillamail.com","tempmail.com","throwaway.email",
    "yopmail.com","sharklasers.com","guerrillamailblock.com","grr.la",
    "guerrillamail.info","guerrillamail.biz","guerrillamail.de","guerrillamail.net",
    "guerrillamail.org","spam4.me","trashmail.com","trashmail.me","trashmail.net",
    "trashmail.at","trashmail.io","trashmail.org","trashmail.xyz","dispostable.com",
    "maildrop.cc","mailnull.com","mailnesia.com","spamgourmet.com","spamgourmet.net",
    "spamgourmet.org","spamgourmet.com","0-mail.com","0815.ru","0815.su",
    "0clickemail.com","10minutemail.com","10minutemail.net","10minutemail.org",
    "20minutemail.com","20minutemail.it","2prong.com","33mail.com","3d-painting.com",
    "4warding.com","4warding.net","4warding.org","5ghgfhyfgbhfg.tk","5ymail.com",
    "agustusmp3.xyz","aha.com.mx","aheadoo.com","ahoo.com.mx","aivmails.com",
    "ajaxapp.net","alivance.com","allthegoodnamesaretaken.com","ama-trade.de",
    "antispam24.de","armyspy.com","beefmilk.com","binkmail.com","bio-muesli.net",
    "bobmail.info","bodhi.lawlita.com","bofthew.com","brefmail.com","bsnow.net",
    "bugmenot.com","bumpymail.com","centermail.com","centermail.net","chacuo.net",
    "chammy.info","chogmail.com","choicemail1.com","clixser.com","cmail.club",
    "cmail.com","cmail.net","cmail.org","col.com.mx","cool.fr.nf","courrieltemporaire.com",
    "crapmail.org","cuvox.de","dacoolest.com","dandikmail.com","dayrep.com",
    "deadaddress.com","deadletter.ga","deagot.com","dealja.com","despam.it",
    "devnullmail.com","dfgh.net","digitalsanctuary.com","discardmail.com",
    "discardmail.de","disposableemailaddresses.com","disposableemailaddresses.emailmiser.com",
    "disposableinbox.com","disposeamail.com","dispostable.com","dodgit.com",
    "dodgit.org","dontreg.com","dontsendmespam.de","drdrb.net","dump-email.info",
    "dumpandfuck.com","dumpmail.de","dumpyemail.com","e-mail.com.mx","e4ward.com",
    "einrot.com","emailgo.de","emailias.com","emailinfive.com","emailisvalid.com",
    "emailmiser.com","emailsensei.com","emailtemporanea.com","emailtemporanea.net",
    "emailto.de","emailwarden.com","emeil.in","emeil.ir","emz.net","enterto.com",
    "ephemail.net","etranquil.com","etranquil.net","etranquil.org","explodemail.com",
    "expressinbox.com","extremail.ru","eyepaste.com","fakeinbox.com","fakeinformation.com",
    "fansworldwide.de","fast-email.com","fazedbookmail.com","fivemail.de",
    "fizmail.com","fleckens.hu","frapmail.com","front14.org","fuckingduh.com",
    "fudgerub.com","fux0ringduh.com","fyii.de","gardenscape.ca","garliclife.com",
    "gehensiemirnichtaufdensack.de","get1mail.com","geteit.com","getmails.eu",
    "getonemail.com","getonemail.net","ghosttexter.de","girlsundertheinfluence.com",
    "gishpuppy.com","glitch.sx","gmbh.email","gmial.com","gotmail.net","gotmail.org",
    "gotti.otherinbox.com","grandmamail.com","grandmasmail.com","great-host.in",
    "greensloth.com","grr.la","gsrv.co.uk","gustr.com","hailmail.net","hatespam.org",
    "herp.in","hidemail.de","hidzz.com","hmamail.com","hopemail.biz","hulapla.de",
    "ieatspam.eu","ieatspam.info","ieh-mail.de","ihateyoualot.info","iheartspam.org",
    "imails.info","inbax.tk","inbox.si","inboxalias.com","incognitomail.com",
    "incognitomail.net","incognitomail.org","inoutmail.de","inoutmail.eu",
    "inoutmail.info","inoutmail.net","insorg.org","instant-mail.de","ipoo.org",
    "irish2me.com","jetable.com","jetable.fr.nf","jetable.net","jetable.org",
    "jnxjn.com","junk.to","junkmail.ga","junkmail.gq","kasmail.com","kaspop.com",
    "keepmymail.com","killmail.com","killmail.net","kir.ch.tc","klassmaster.com",
    "klassmaster.net","klassmaster.org","klzlk.com","koszmail.pl","kurzepost.de",
    "letthemeatspam.com","lhsdv.com","lifebyfood.com","link2mail.net","litedrop.com",
    "lol.ovpn.to","lolfreak.net","lookugly.com","lortemail.dk","losemymail.com",
    "lovemeleaveme.com","lr78.com","maboard.com","mail-filter.com","mail-temporaire.fr",
    "mail.mezimages.net","mail1a.de","mail21.cc","mail2rss.org","mail333.com",
    "mailbidon.com","mailbiz.biz","mailblocks.com","mailbucket.org","mailcat.biz",
    "mailcatch.com","maildrop.cc","maileater.com","mailexpire.com","mailfa.tk",
    "mailforspam.com","mailfreeonline.com","mailguard.me","mailimate.com",
    "mailin8r.com","mailinater.com","mailme.lv","mailme24.com","mailmetrash.com",
    "mailmoat.com","mailms.com","mailnew.com","mailnull.com","mailpick.biz",
    "mailproxsy.com","mailquack.com","mailrock.biz","mailscrap.com","mailseal.de",
    "mailshell.com","mailsiphon.com","mailslite.com","mailtemp.info","mailtome.de",
    "mailtothis.com","mailtrash.net","mailtv.net","mailtv.tv","mailzilla.com",
    "makemetheking.com","manybrain.com","mbx.cc","meltmail.com","messagebeamer.de",
    "mezimages.net","mfsa.ru","mierdamail.com","migmail.net","migmail.pl",
    "migumail.com","mindless.com","ministerial.com","moncourrier.fr.nf",
    "monemail.fr.nf","monmail.fr.nf","monumentmail.com","mswork.ru","mt2009.com",
    "mt2014.com","mx0.wwwnew.eu","mycleaninbox.net","mypartyclip.de","myphantomemail.com",
    "myspaceinc.com","myspaceinc.net","myspaceinc.org","myspacepimps.net",
    "mytrashmail.com","nabuma.com","neomailbox.com","nepwk.com","nervmich.net",
    "nervtmich.net","netmails.net","netmails.com","newfilter.org","nice-4u.com",
    "nobulk.com","noclickemail.com","nogmailspam.info","nomail.pw","nomail.xl.cx",
    "nomail2me.com","nomorespamemails.com","nonspam.eu","nonspammer.de","noref.in",
    "norseforce.com","nospam.ze.tc","nospam4.us","nospamfor.us","nospammail.net",
    "nospamthanks.info","notmailinator.com","nowhere.org","nwldx.com","objectmail.com",
    "obobbo.com","odnorazovoe.ru","oneoffemail.com","onewaymail.com","oommail.com",
    "oopi.org","opayq.com","ordinaryamerican.net","otherinbox.com","ovpn.to",
    "owlpic.com","pancakemail.com","paplease.com","payspade.com","pjjkp.com",
    "plexolan.de","poczta.onet.pl","politikerclub.de","poofy.org","pookmail.com",
    "recode.me","recursor.net","reliable-mail.com","reallymymail.com","rppkn.com",
    "rtrtr.com","s0ny.net","safe-mail.net","safetymail.info","safetypost.de",
    "sandelf.de","sast.ro","scatmail.com","schafmail.de","schrott-mail.de",
    "secretmail.net","seersolutionfind.info","send-email.org","sendspamhere.com",
    "senseless-entertainment.com","sharedmailbox.org","shitmail.me","shitmail.org",
    "sibmail.com","single-girl.com","sinnlos-mail.de","slapsfromlastnight.com",
    "slaskpost.se","smashmail.de","smellfear.com","snakemail.com","sneakemail.com",
    "sneakmail.de","snkmail.com","sofimail.com","sofort-mail.de","solvemail.info",
    "soodonims.com","spam.la","spam.org.tr","spam.su","spambox.us","spamcon.org",
    "spamfree24.de","spamfree24.eu","spamfree24.info","spamfree24.net","spamfree24.org",
    "spamgoes.in","spamgourmet.com","spamgourmet.net","spamgourmet.org","spamherelots.com",
    "spamhereplease.com","spamhole.com","spamify.com","spamkill.info","spaml.com",
    "spaml.de","spammotel.com","spamoff.de","spamsalad.in","spamslicer.com",
    "spamspot.com","spamthis.co.uk","spamthisplease.com","spamtrail.com","speed.1s.fr",
    "spoofmail.de","spray.se","squizzy.de","squizzy.eu","squizzy.net","stinkefinger.net",
    "stuffmail.de","super-auswahl.de","supergreatmail.com","supermailer.jp",
    "superstachel.de","suremail.info","svk.jp","sweetxxx.de","tafmail.com","tagyourself.com",
    "talkinator.com","tapchicuocsong.org","teewars.org","teleworm.com","teleworm.us",
    "tempalias.com","tempe-mail.com","tempemail.biz","tempemail.com","tempemail.net",
    "tempinbox.co.uk","tempinbox.com","tempmail.eu","tempmail.it","tempmailo.com",
    "tempomail.fr","temporaryemail.net","temporaryemail.us","temporaryforwarding.com",
    "temporaryinbox.com","thanksnospam.info","thisisnotmyrealemail.com","throam.com",
    "throwam.com","throwspam.com","tilien.com","tittbit.in","tmail.com","tmailinator.com",
    "toiea.com","tradermail.info","trash-amil.com","trash-mail.at","trash-mail.cf",
    "trash-mail.com","trash-mail.de","trash-mail.ga","trash-mail.gq","trash-mail.io",
    "trash-mail.ml","trash-mail.net","trash-mail.tk","trash2009.com","trash2010.com",
    "trash2011.com","trashdevil.com","trashdevil.de","trashemail.de","trashimail.com",
    "trashmail.app","trashmail.at","trashmail.com","trashmail.gq","trashmail.io",
    "trashmail.me","trashmail.net","trashmail.org","trashmail.xyz","trashmailer.com",
    "trashmaill.com","trashmails.com","trox.in","turual.com","twinmail.de",
    "tyldd.com","uggsrock.com","umail.net","undo.it","unids.com","unionmail.net",
    "uroid.com","uwork.co.uk","venompen.com","veryrealemail.com","vidchart.com",
    "viditag.com","viewcastmedia.com","viewcastmedia.net","viewcastmedia.org",
    "vomoto.com","vubby.com","walala.org","walkmail.net","watchfull.net","webemail.me",
    "webm4il.info","wegwerfadresse.de","wegwerfemail.com","wegwerfemail.de",
    "wegwerfemail.net","wegwerfemail.org","wegwerfmail.de","wegwerfmail.info",
    "wegwerfmail.net","wegwerfmail.org","wetrainbayarea.com","wetrainbayarea.org",
    "wh4f.org","whyspam.me","wickmail.net","willhackforfood.biz","willselfdestruct.com",
    "winemaven.info","wollan.info","wuzupmail.net","www.e4ward.com","www.mailinator.com",
    "xagloo.co","xagloo.com","xemaps.com","xents.com","xmaily.com","xoxy.net",
    "xyzfree.net","yepmail.net","yert.ye.vc","yogamaven.com","yopmail.com","yopmail.fr",
    "yourdomain.com","yuurok.com","z1p.biz","zehnminuten.de","zehnminutenmail.de",
    "zippymail.info","zoemail.net","zoemail.org","zomg.info",
  ]);

  // ── VALIDACION DE FORMATO ─────────────────────────────────────────────────
  function validFormat(email) {
    return /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(email.trim().toLowerCase());
  }

  // ── VALIDACION DE DOMINIO DESECHABLE ─────────────────────────────────────
  function isDisposable(email) {
    const domain = email.trim().toLowerCase().split("@")[1] || "";
    return DISPOSABLE.has(domain);
  }

  // ── VALIDACION CON ZEROBOUNCE API ────────────────────────────────────────
  // ZeroBounce verifica en tiempo real si el correo existe en el servidor
  // de destino. Estados: valid | invalid | catch-all | unknown | spamtrap |
  // abuse | do_not_mail | disposable
  async function checkZeroBounce(email) {
    if (!ZEROBOUNCE_KEY) return { valid: true, skipped: true };
    try {
      const url = "https://api.zerobounce.net/v2/validate?api_key=" + ZEROBOUNCE_KEY
        + "&email=" + encodeURIComponent(email.trim())
        + "&ip_address=";
      const res = await fetch(url);
      if (!res.ok) return { valid: true, skipped: true }; // si falla, no bloquear
      const data = await res.json();
      const status = (data.status || "").toLowerCase();
      // Rechazar solo correos claramente invalidos o maliciosos
      if (status === "invalid")     return { valid: false, reason: "El correo no existe o no puede recibir mensajes." };
      if (status === "spamtrap")    return { valid: false, reason: "Este correo esta marcado como trampa de spam." };
      if (status === "abuse")       return { valid: false, reason: "Este correo esta reportado por abuso." };
      if (status === "do_not_mail") return { valid: false, reason: "Este correo no puede recibir mensajes." };
      if (status === "disposable")  return { valid: false, reason: "No se permiten correos temporales o desechables." };
      // "valid", "catch-all", "unknown" → dejar pasar (fail-open para no perder leads legitimos)
      return { valid: true };
    } catch {
      return { valid: true, skipped: true }; // error de red → no bloquear
    }
  }

  // ── FUNCION PRINCIPAL ─────────────────────────────────────────────────────
  // Devuelve { valid: bool, reason: string | null, level: "format"|"disposable"|"api"|"ok" }
  async function validate(email) {
    const e = (email || "").trim().toLowerCase();
    if (!validFormat(e))  return { valid: false, reason: "El formato del correo no es valido.", level: "format" };
    if (isDisposable(e))  return { valid: false, reason: "No se permiten correos temporales o desechables.", level: "disposable" };
    const apiResult = await checkZeroBounce(e);
    if (!apiResult.valid) return { valid: false, reason: apiResult.reason || "El correo no pudo ser verificado.", level: "api" };
    return { valid: true, reason: null, level: "ok" };
  }

  // ── ESTADO DE CONFIGURACION ───────────────────────────────────────────────
  function hasApiKey() { return !!ZEROBOUNCE_KEY; }

  return { validate, hasApiKey };
})();

Object.assign(window, { EmailValidator });
