// ─────────────────────────────────────────────────────────────────────────
// Vivense — Mobilya / Ev Dekorasyon SEO Dashboard
// Dynamic data: GSC + GA4 (live via /api/dashboard?range=...)
// Static (Semrush TR DB, Nisan 2026 — haftalık manuel refresh):
//   COMPETITORS, KEYWORD_OVERLAP, BACKLINKS, SEMRUSH_OVERVIEW
// Illüstrasyon: TECH, AI_MENTIONS (entegrasyon sonraki fazda)
// ─────────────────────────────────────────────────────────────────────────

const BRANDS = [
  { id: "vivense",  name: "Vivense",   url: "vivense.com",      initials: "VV", color: "#1F4E5F", logoTile: "viv", logoName: "ense" },
  { id: "istikbal", name: "İstikbal",  url: "istikbal.com.tr",  initials: "IS", color: "#C8102E" },
  { id: "bellona",  name: "Bellona",   url: "bellona.com.tr",   initials: "BL", color: "#0050A0" },
  { id: "enzahome", name: "Enza Home", url: "enzahome.com.tr",  initials: "EN", color: "#8B6F47" },
  { id: "dogtas",   name: "Doğtaş",    url: "dogtas.com",       initials: "DT", color: "#4A2E1A" },
  { id: "kelebek",  name: "Kelebek",   url: "kelebek.com",      initials: "KL", color: "#E5A823" },
];

// ─── Semrush Overview (TR DB, Nisan 2026) ────────────────────────────────
const SEMRUSH_OVERVIEW = {
  organicKeywords: 99298,
  organicTraffic: 1026544,
  organicTrafficCost: 94951,
  paidKeywords: 5362,
  paidTraffic: 373499,
  paidTrafficCost: 153923,
  authorityScore: 55,
  totalBacklinks: 477132,
  refDomains: 2432,
  dofollowPct: 97.5,
  database: "TR",
  refreshedAt: "2026-04-29",
};

// ─── Competitor Share-of-Voice (Semrush TR DB, Nisan 2026) ───────────────
// clicks = aylık organik trafik tahmini, kw = sıralanan keyword sayısı,
// dr = Semrush Authority Score, share = bu 6 marka arasındaki organik pay.
const COMPETITORS = [
  { name: "Vivense",   clicks: 1026544, kw:  99298, dr: 55, share: 18.3, you: true },
  { name: "İstikbal",  clicks: 1833987, kw: 140732, dr: 54, share: 32.8 },
  { name: "Bellona",   clicks: 1211233, kw: 169170, dr: 51, share: 21.6 },
  { name: "Enza Home", clicks:  567978, kw:  69343, dr: 40, share: 10.2 },
  { name: "Doğtaş",    clicks:  490548, kw:  87323, dr: 44, share:  8.8 },
  { name: "Kelebek",   clicks:  465193, kw:  85318, dr: 42, share:  8.3 },
];

// ─── Vivense'in en yüksek organik trafiği getiren keyword'leri (Semrush) ──
// pos sırası: [Vivense, İstikbal, Bellona, Enza Home, Doğtaş]. 0 = top100 dışı.
// Faz 2: rakip keyword pozisyonları için domain_domains gap raporu çekilecek.
const KEYWORD_OVERLAP = [
  { kw: "vivense",                    vol: 201000, pos: [1,  0,  0,  0,  0] },
  { kw: "biblo",                      vol: 201000, pos: [6,  0,  0,  0,  0] },
  { kw: "çalışma masası",             vol: 135000, pos: [2,  0,  0,  0,  0] },
  { kw: "köşe takımı",                vol: 110000, pos: [2,  0,  0,  0,  0] },
  { kw: "l koltuk",                   vol:  90500, pos: [2,  0,  0,  0,  0] },
  { kw: "mutfak masası",              vol:  74000, pos: [3,  0,  0,  0,  0] },
  { kw: "dresuar",                    vol:  60500, pos: [2,  0,  0,  0,  0] },
  { kw: "kitaplık",                   vol:  49500, pos: [2,  0,  0,  0,  0] },
  { kw: "komodin",                    vol:  40500, pos: [1,  0,  0,  0,  0] },
  { kw: "gardırop",                   vol:  40500, pos: [1,  0,  0,  0,  0] },
  { kw: "yemek masası takımı",        vol:  33100, pos: [1,  0,  0,  0,  0] },
  { kw: "kanepe",                     vol:  27100, pos: [1,  0,  0,  0,  0] },
  { kw: "tv sehpası",                 vol:  27100, pos: [1,  0,  0,  0,  0] },
  { kw: "baza başlık",                vol:  22200, pos: [1,  0,  0,  0,  0] },
  { kw: "vivense koltuk takımı",      vol:   6600, pos: [1,  0,  0,  0,  0] },
];

// ─── Top referring domains (Semrush, Authority Score sırasıyla) ──────────
const BACKLINKS = [
  { domain: "github.com",      dr: 100, refs:  1, type: "dofollow", anchor: "vivense.com",        first: "Mar 14" },
  { domain: "google.com",      dr: 100, refs:  4, type: "dofollow", anchor: "vivense",            first: "Tem 26" },
  { domain: "pinterest.com",   dr: 100, refs: 14, type: "dofollow", anchor: "Vivense ürün",       first: "Ara 06" },
  { domain: "yahoo.com",       dr: 100, refs:  6, type: "dofollow", anchor: "vivense.com",        first: "Eyl 12" },
  { domain: "bing.com",        dr:  97, refs: 65, type: "dofollow", anchor: "vivense",            first: "Mar 26" },
  { domain: "yandex.com",      dr:  96, refs: 17, type: "dofollow", anchor: "vivense.com",        first: "Eyl 14" },
  { domain: "milliyet.com.tr", dr:  92, refs:  1, type: "dofollow", anchor: "Vivense",            first: "Şub 30" },
  { domain: "yandex.com.tr",   dr:  92, refs: 20, type: "dofollow", anchor: "vivense",            first: "Kas 28" },
  { domain: "uptodown.com",    dr:  91, refs: 23, type: "dofollow", anchor: "Vivense uygulaması", first: "Eyl 01" },
  { domain: "linktr.ee",       dr:  89, refs:  6, type: "dofollow", anchor: "vivense.com",        first: "Ağu 10" },
];

// ─── Illüstrasyon (canlı entegrasyon sonraki fazda) ───────────────────────
const TECH = [
  { c: "İndekslenebilir sayfa",     v: 0, total: 0,   tone: "ok",   note: "Site-audit entegrasyonu beklemede" },
  { c: "Crawl hatası (4xx/5xx)",    v: 0, total: 0,   tone: "warn", note: "Site-audit entegrasyonu beklemede" },
  { c: "Mobil uyumluluk",           v: 0, total: 0,   tone: "ok",   note: "Site-audit entegrasyonu beklemede" },
  { c: "Core Web Vitals (LCP)",     v: 0, total: 100, tone: "warn", note: "PSI entegrasyonu beklemede" },
  { c: "Core Web Vitals (INP)",     v: 0, total: 100, tone: "warn", note: "PSI entegrasyonu beklemede" },
  { c: "Core Web Vitals (CLS)",     v: 0, total: 100, tone: "warn", note: "PSI entegrasyonu beklemede" },
  { c: "Schema kapsamı",            v: 0, total: 0,   tone: "warn", note: "Site-audit entegrasyonu beklemede" },
  { c: "Bozuk iç bağlantı",         v: 0, total: 0,   tone: "warn", note: "Site-audit entegrasyonu beklemede" },
];

const AI_MENTIONS = [
  { engine: "ChatGPT",    cited: 0, share: 0, d: 0, queries: ["online mobilya tavsiyesi", "vivense yorum", "en iyi mobilya markaları"] },
  { engine: "Perplexity", cited: 0, share: 0, d: 0, queries: ["online köşe takımı önerisi", "kaliteli kanepe markası"] },
  { engine: "Google AIO", cited: 0, share: 0, d: 0, queries: ["vivense güvenilir mi", "vivense iade politikası"] },
  { engine: "Claude",     cited: 0, share: 0, d: 0, queries: ["mobilya online satın alma", "yatak odası takımı önerisi"] },
];

// ─── Dynamic data: fetched per range from /api/dashboard ─────────────────

const trFmt = (n) => Math.round(n).toLocaleString("tr-TR");
const trPct = (n) => `${n >= 0 ? "+" : ""}${n.toFixed(1)}%`;

function shapeDashboard(raw) {
  const snap = raw.snapshot || { current: {}, prior: {}, change: {} };
  const cur = snap.current || {};
  const prior = snap.prior || {};
  const ga4 = (raw.ga4Overview?.rows || [])[0] || {};

  const KPIS = [
    {
      l: "Organik tıklama (GSC)",
      v: trFmt(cur.clicks || 0),
      d: trPct(snap.change?.clicksPercent || 0),
      tone: (snap.change?.clicks || 0) >= 0 ? "up" : "down",
    },
    {
      l: "Gösterim (GSC)",
      v: trFmt(cur.impressions || 0),
      d: trPct(snap.change?.impressionsPercent || 0),
      tone: (snap.change?.impressions || 0) >= 0 ? "up" : "down",
    },
    {
      l: "Ortalama pozisyon",
      v: (cur.position || 0).toFixed(1),
      d: `${(snap.change?.position || 0) > 0 ? "+" : ""}${(snap.change?.position || 0).toFixed(1)}`,
      tone: (snap.change?.position || 0) <= 0 ? "up" : "down",
    },
    {
      l: "Aktif kullanıcı (GA4)",
      v: trFmt(ga4.activeUsers || 0),
      d: "—",
      tone: "up",
    },
  ];

  const dateRows = (raw.dateRows?.rows || [])
    .slice()
    .sort((a, b) => (a.keys[0] < b.keys[0] ? -1 : 1));
  const TR_MONTHS = ["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"];
  const TRAFFIC = dateRows.map((r, i) => {
    const dateStr = r.keys[0];
    const dt = new Date(dateStr);
    return {
      d: i,
      date: dateStr,
      label: `${dt.getDate()} ${TR_MONTHS[dt.getMonth()]}`,
      clicks: r.clicks,
      imp: r.impressions,
    };
  });

  const pageMap = new Map();
  (raw.pageRows?.rows || []).forEach((r) => {
    const raw_url = r.keys[0] || "";
    const path = raw_url.replace(/^https?:\/\/[^/]+/, "") || "/";
    const existing = pageMap.get(path);
    if (existing) {
      existing.clicks += r.clicks;
      existing.imp += r.impressions;
      existing.posSum += r.position * r.impressions;
      existing.impSum += r.impressions;
    } else {
      pageMap.set(path, {
        url: path,
        clicks: r.clicks,
        imp: r.impressions,
        posSum: r.position * r.impressions,
        impSum: r.impressions,
        d: 0,
      });
    }
  });
  const TOP_PAGES = Array.from(pageMap.values())
    .map((p) => ({
      url: p.url,
      clicks: p.clicks,
      imp: p.imp,
      ctr: +(p.imp ? (p.clicks / p.imp) * 100 : 0).toFixed(2),
      pos: +(p.impSum ? p.posSum / p.impSum : 0).toFixed(1),
      d: 0,
    }))
    .sort((a, b) => b.clicks - a.clicks)
    .slice(0, 10);

  const KEYWORDS = (raw.queryRows?.rows || []).slice(0, 15).map((r) => ({
    kw: r.keys[0] || "",
    pos: +r.position.toFixed(1),
    prev: +r.position.toFixed(1),
    vol: r.impressions,
    ctr: +r.ctr.toFixed(2),
    url: "/",
  }));

  // ─── Aylık organik trafik (son 12 ay, GSC date dim aggregated) ─────────
  // Kısmi aylar (ilk ay = window başlangıcı, son ay = içinde bulunulan ay) işaretlenir.
  const monthMap = new Map();
  (raw.monthlyDateRows?.rows || []).forEach((r) => {
    const dateStr = r.keys[0] || "";
    const ym = dateStr.slice(0, 7); // "2026-04"
    if (!ym) return;
    const acc = monthMap.get(ym) || { ym, clicks: 0, imp: 0, days: 0 };
    acc.clicks += r.clicks || 0;
    acc.imp += r.impressions || 0;
    acc.days += 1;
    monthMap.set(ym, acc);
  });
  const today = new Date();
  const currentYM = `${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, "0")}`;
  const MONTHLY_TRAFFIC = Array.from(monthMap.values())
    .sort((a, b) => (a.ym < b.ym ? -1 : 1))
    .map((m, idx, arr) => {
      const [y, mo] = m.ym.split("-");
      const dt = new Date(+y, +mo - 1, 1);
      const daysInMonth = new Date(+y, +mo, 0).getDate();
      const isCurrentMonth = m.ym === currentYM;
      // İlk ay window'un kesildiği yerse (gün sayısı ay toplamından az) kısmi sayılır.
      const isWindowStart = idx === 0 && m.days < daysInMonth;
      const partial = isCurrentMonth || isWindowStart;
      return {
        ym: m.ym,
        label: `${TR_MONTHS[dt.getMonth()]} ${String(y).slice(2)}`,
        clicks: m.clicks,
        imp: m.imp,
        days: m.days,
        daysInMonth,
        partial,
      };
    });

  return { KPIS, TRAFFIC, TOP_PAGES, KEYWORDS, MONTHLY_TRAFFIC, period: { range: raw.range, days: raw.days } };
}

const DataContext = React.createContext({ loading: true, fetching: false, data: null, error: null });
const useDashData = () => React.useContext(DataContext);

const DataProvider = ({ range, children }) => {
  const [state, setState] = React.useState({ loading: true, fetching: true, data: null, error: null });

  React.useEffect(() => {
    let cancelled = false;
    setState((s) => ({ ...s, fetching: true, error: null }));
    fetch(`/api/dashboard?range=${range}`)
      .then((r) => {
        if (!r.ok) throw new Error(`HTTP ${r.status}`);
        return r.json();
      })
      .then((raw) => {
        if (cancelled) return;
        setState({ loading: false, fetching: false, data: shapeDashboard(raw), error: null });
      })
      .catch((err) => {
        if (cancelled) return;
        setState((s) => ({ ...s, loading: !s.data, fetching: false, error: err.message }));
      });
    return () => {
      cancelled = true;
    };
  }, [range]);

  return <DataContext.Provider value={state}>{children}</DataContext.Provider>;
};

Object.assign(window, {
  BRANDS, BACKLINKS, TECH, AI_MENTIONS, COMPETITORS, KEYWORD_OVERLAP, SEMRUSH_OVERVIEW,
  DataContext, DataProvider, useDashData,
});
