// ─────────────────────────────────────────────────────────────────────────
// Özgürzaman — Güvenlik / X-Ray Cihazları SEO Dashboard
// Dynamic data: GSC + GA4 (live via /api/dashboard?range=...).
// Static (Semrush TR DB — refresh edildiğinde dolacak):
//   COMPETITORS, KEYWORD_OVERLAP, BACKLINKS, SEMRUSH_OVERVIEW
// Illüstrasyon: TECH, AI_MENTIONS (entegrasyon sonraki fazda)
// ─────────────────────────────────────────────────────────────────────────

const BRANDS = [
  { id: "ozgurzaman",     name: "Özgürzaman",      url: "ozgurzaman.com",          initials: "ÖZ", color: "#0E5BA3", logoTile: "ozgur", logoName: "zaman" },
  { id: "polimek",        name: "Polimek",         url: "polimek.com.tr",          initials: "PM", color: "#C0392B" },
  { id: "zkteco",         name: "ZKTeco",          url: "zkteco.com.tr",           initials: "ZK", color: "#1F6F8B" },
  { id: "perkotek",       name: "Perkotek",        url: "perkotek.com",            initials: "PK", color: "#0F4C81" },
  { id: "dengeelektronik", name: "Denge Elektronik", url: "dengeelektronik.com.tr", initials: "DE", color: "#3E5C76" },
];

// ─── Semrush Overview (TR DB, refreshed 2026-05-07) ──────────────────────
const SEMRUSH_OVERVIEW = {
  organicKeywords: 837,
  organicTraffic: 1398,
  organicTrafficCost: 413,
  paidKeywords: 26,
  paidTraffic: 152,
  paidTrafficCost: 74,
  authorityScore: 11,
  totalBacklinks: 548,
  refDomains: 145,
  dofollowPct: 38.7,
  database: "TR",
  refreshedAt: "2026-05-07",
};

// ─── Competitor Share-of-Voice (Semrush TR DB, 2026-05-07) ───────────────
// clicks = aylık organik trafik tahmini, kw = sıralanan keyword sayısı,
// dr = Semrush Authority Score, share = bu 5 marka arasındaki organik pay (%).
// Rakipler domain_organic_organic ile competitor_relevance sırasıyla seçildi.
const COMPETITORS = [
  { name: "Özgürzaman",       clicks:  1398, kw:  837, dr: 11, share:  6.3, you: true },
  { name: "Polimek",          clicks:  2466, kw:  885, dr: 12, share: 11.1 },
  { name: "ZKTeco",           clicks:  6072, kw: 1113, dr: 20, share: 27.4 },
  { name: "Perkotek",         clicks:  9944, kw: 4477, dr: 30, share: 44.9 },
  { name: "Denge Elektronik", clicks:  2248, kw:  620, dr: 14, share: 10.2 },
];

// ─── Özgürzaman'nın top organic kw (GSC top sorgular, 28d) ───────────────
// pos sırası: [Özgürzaman, Garanti Güvenlik, Özdetect, Smiths Detection, Rapiscan].
// Rakip pozisyonları Semrush domain_domains gap raporu ile doldurulacak.
const KEYWORD_OVERLAP = [
  { kw: "özgür zaman",                          vol:   192, pos: [2,    0, 0, 0, 0] },
  { kw: "el dedektörü kullanımı",               vol:   245, pos: [1.7,  0, 0, 0, 0] },
  { kw: "x ray cihazı",                         vol: 25375, pos: [5,    0, 0, 0, 0] },
  { kw: "el dedektörü kullanma talimatı",       vol:    39, pos: [1,    0, 0, 0, 0] },
  { kw: "el dedektörü nasıl kullanılır",        vol:   162, pos: [2,    0, 0, 0, 0] },
  { kw: "xray cihazı",                          vol:  6651, pos: [4.3,  0, 0, 0, 0] },
  { kw: "özgür zaman kontrol sistemleri",       vol:    50, pos: [2.2,  0, 0, 0, 0] },
  { kw: "plaka tanıma sistemi",                 vol:   321, pos: [11.6, 0, 0, 0, 0] },
  { kw: "plaka tanıma sistemleri",              vol:    44, pos: [11.3, 0, 0, 0, 0] },
  { kw: "webpdks",                              vol:   180, pos: [4.3,  0, 0, 0, 0] },
  { kw: "el dedektörü nasıl çalışır",           vol:   121, pos: [2.8,  0, 0, 0, 0] },
  { kw: "özel güvenlik el dedektörü kullanımı", vol:   119, pos: [2.1,  0, 0, 0, 0] },
  { kw: "el dedektörü ile üst araması",         vol:    61, pos: [5,    0, 0, 0, 0] },
  { kw: "filo yönetimi",                        vol:   167, pos: [16.7, 0, 0, 0, 0] },
  { kw: "geçiş kontrol sistemleri",             vol:   132, pos: [7.2,  0, 0, 0, 0] },
];

// ─── Top referring domains (Semrush, Authority Score sırasıyla, 2026-05-07) ─
const BACKLINKS = [
  { domain: "yahoo.com",            dr: 100, refs:  1, type: "dofollow", anchor: "ozgurzaman.com", first: "Mar 2026" },
  { domain: "yandex.com",           dr:  96, refs:  1, type: "dofollow", anchor: "ozgurzaman.com", first: "Oca 2025" },
  { domain: "yandex.com.tr",        dr:  91, refs:  1, type: "dofollow", anchor: "ozgurzaman",     first: "Ara 2025" },
  { domain: "dogruhaber.com.tr",    dr:  47, refs:  1, type: "dofollow", anchor: "Özgür Zaman",    first: "Haz 2025" },
  { domain: "firmasec.com",         dr:  44, refs:  1, type: "dofollow", anchor: "ozgurzaman.com", first: "Kas 2024" },
  { domain: "habergazetesi.com.tr", dr:  43, refs:  2, type: "dofollow", anchor: "Özgür Zaman",    first: "Ara 2024" },
  { domain: "mardinlife.com",       dr:  41, refs:  2, type: "dofollow", anchor: "Özgür Zaman",    first: "Eki 2025" },
  { domain: "sitelike.org",         dr:  41, refs:  1, type: "dofollow", anchor: "ozgurzaman.com", first: "Şub 2026" },
  { domain: "tr.gg",                dr:  39, refs: 32, type: "dofollow", anchor: "ozgurzaman.com", first: "Kas 2023" },
  { domain: "habereguven.com",      dr:  33, refs:  2, type: "dofollow", anchor: "Özgür Zaman",    first: "May 2025" },
];

// ─── 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: ["en iyi x-ray cihazı markaları", "özgür zaman güvenilir mi", "el dedektörü önerisi"] },
  { engine: "Perplexity", cited: 0, share: 0, d: 0, queries: ["plaka tanıma sistemi tedarikçisi", "geçiş kontrol sistemi nasıl seçilir"] },
  { engine: "Google AIO", cited: 0, share: 0, d: 0, queries: ["x-ray cihazı nedir", "el dedektörü nasıl kullanılır"] },
  { engine: "Claude",     cited: 0, share: 0, d: 0, queries: ["güvenlik tarama cihazı tedarikçi", "filo yönetim sistemi"] },
];

// ─── 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,
});
