// Referral utilities: generate codes, track invites, grant premium bonus.
// Storage:
//   aw.referrals: { [code]: { ownerEmail, createdAt, redeemed: [{email, at}] } }
//   user.referredBy: code (set at signup if r=CODE was in URL)
//   user.referralCode: code (own code, generated lazily)

const _generateCode = (email) => {
  // Deterministic but readable: first 3 chars of email + 4-char random
  const base = (email || '').replace(/[^a-z0-9]/gi, '').slice(0, 3).toUpperCase() || 'AWX';
  const rand = Math.random().toString(36).slice(2, 6).toUpperCase();
  return `${base}-${rand}`;
};

const loadReferralStore = () => {
  try { return JSON.parse(localStorage.getItem('aw.referrals') || '{}'); } catch { return {}; }
};
const saveReferralStore = (r) => {
  try { localStorage.setItem('aw.referrals', JSON.stringify(r)); } catch {}
};

// Get-or-create a referral code for a user.
const getOrCreateReferralCode = (user) => {
  if (!user) return null;
  if (user.referralCode) return user.referralCode;
  const store = loadReferralStore();
  // Re-use if already in store
  const existing = Object.entries(store).find(([, v]) => v.ownerEmail === (user.email || '').toLowerCase());
  if (existing) return existing[0];
  const code = _generateCode(user.email);
  store[code] = { ownerEmail: (user.email || '').toLowerCase(), createdAt: new Date().toISOString(), redeemed: [] };
  saveReferralStore(store);
  return code;
};

// Apply a referral redemption: invitee uses code at signup or while logged in.
// Returns { ok, message, bonusDays } and updates premium expiration on both users.
const redeemReferralCode = (code, inviteeEmail, settings) => {
  const r = settings.referral;
  if (!r || !r.enabled) return { ok: false, message: 'Werbeprogramm ist deaktiviert.' };
  if (!code) return { ok: false, message: 'Kein Code angegeben.' };
  const store = loadReferralStore();
  const entry = store[code.trim().toUpperCase()];
  if (!entry) return { ok: false, message: 'Code ungültig.' };
  if (entry.ownerEmail === inviteeEmail.toLowerCase())
    return { ok: false, message: 'Du kannst deinen eigenen Code nicht einlösen.' };
  if (entry.redeemed.some(x => x.email === inviteeEmail.toLowerCase()))
    return { ok: false, message: 'Dieser Code wurde von dir schon eingelöst.' };

  // Check owner's reward cap
  if (r.maxRewardsPerUser && entry.redeemed.length >= r.maxRewardsPerUser)
    return { ok: false, message: 'Der Code hat sein Bonus-Limit erreicht.' };

  const bonusDays = r.rewardDays || 30;
  entry.redeemed.push({ email: inviteeEmail.toLowerCase(), at: new Date().toISOString() });
  saveReferralStore(store);

  // Grant bonus to owner (via aw.creds) and to invitee (caller updates the live user).
  try {
    const creds = JSON.parse(localStorage.getItem('aw.creds') || '{}');
    const owner = creds[entry.ownerEmail];
    if (owner) {
      const now = Date.now();
      const cur = owner.premium && owner.premium.expiresAt ? new Date(owner.premium.expiresAt).getTime() : now;
      const base = Math.max(cur, now);
      owner.premium = {
        active: true,
        cycle: 'bonus',
        since: owner.premium && owner.premium.since ? owner.premium.since : new Date().toISOString(),
        expiresAt: new Date(base + bonusDays * 86400e3).toISOString(),
        source: 'referral',
      };
      creds[entry.ownerEmail] = owner;
      localStorage.setItem('aw.creds', JSON.stringify(creds));
    }
  } catch {}

  return {
    ok: true,
    message: r.rewardForBoth
      ? `Geschafft! Du und dein Freund bekommen ${bonusDays} Tage Premium.`
      : `Geschafft! Du bekommst ${bonusDays} Tage Premium.`,
    bonusDays,
    rewardForBoth: !!r.rewardForBoth,
  };
};

// Build a redeemable URL for a code.
const referralLink = (code) => {
  const baseUrl = `${location.origin}${location.pathname}`;
  return `${baseUrl}?r=${encodeURIComponent(code)}`;
};

// Check URL for ?r=CODE and return it (does NOT auto-redeem).
const pendingReferralFromUrl = () => {
  try {
    const url = new URL(location.href);
    return url.searchParams.get('r');
  } catch { return null; }
};

Object.assign(window, {
  getOrCreateReferralCode, redeemReferralCode, referralLink,
  loadReferralStore, pendingReferralFromUrl,
});
