/**
 * setup-server.js — Kurulum Sihirbazı (kurulum tamamlanana kadar çalışır)
 * Kullanıcı lisans + Gemini anahtarı + Gmail bağlantısı + profil girer.
 * Bitince config yazılır ve asıl uygulama (server.js) aynı port üzerinde başlar.
 */

const express = require('express');
const fs = require('fs');
const os = require('os');
const path = require('path');
const https = require('https');
const { google } = require('googleapis');
const { machineId, verifyLicense } = require('./lib/license');

const PORT = Number(process.env.PORT) || 3737;
let _sea = null; try { _sea = require('node:sea'); } catch {}
const SEA = !!(_sea && _sea.isSea && _sea.isSea());
const TABAN = (process.pkg || SEA) ? path.dirname(process.execPath) : __dirname;
const DATA_DIR = process.env.DAYI_DATA || path.join(TABAN, 'data');
fs.mkdirSync(DATA_DIR, { recursive: true });
function arayuzOku(ad) {
  if (SEA) return _sea.getAsset(ad, 'utf8');
  return fs.readFileSync(path.join(__dirname, 'public', ad), 'utf8');
}
const CONFIG_PATH = path.join(DATA_DIR, 'config.json');
const LICENSE_PATH = path.join(DATA_DIR, 'license.key');
const TOKEN_PATH = path.join(DATA_DIR, 'gmail_token.json');
const MEMORY_PATH = path.join(DATA_DIR, 'memory.json');

const SCOPES = [
  'https://www.googleapis.com/auth/gmail.readonly',
  'https://www.googleapis.com/auth/gmail.send',
  'https://www.googleapis.com/auth/gmail.modify',
];
const REDIRECT = `http://localhost:${PORT}/oauth2callback`;

// Kurulum boyunca toplanan geçici veriler
const gecici = { keys: null, oauth: null, tokenAlindi: false, profil: null };
let oauthClient = null;

// ─── Gemini anahtar testi ────────────────────────────────────────────────────
function geminiPingTek(key) {
  return new Promise(resolve => {
    const body = JSON.stringify({ contents: [{ parts: [{ text: 'ping' }] }], generationConfig: { maxOutputTokens: 5 } });
    const req = https.request({
      hostname: 'generativelanguage.googleapis.com',
      path: `/v1beta/models/gemini-2.5-flash-lite:generateContent?key=${key}`,
      method: 'POST', headers: { 'Content-Type': 'application/json' },
    }, r => {
      const ch = [];
      r.on('data', c => ch.push(c));
      r.on('end', () => {
        try {
          const d = JSON.parse(Buffer.concat(ch).toString());
          if (d.error) {
            // kota/oran hatası bile anahtarın GEÇERLİ olduğunu gösterir
            if (/quota|RESOURCE_EXHAUSTED|rate|exhausted|overloaded|high demand/i.test(d.error.message)) return resolve({ ok: true, kota: true });
            return resolve({ ok: false, hata: d.error.message, agHatasi: false });
          }
          resolve({ ok: true });
        } catch { resolve({ ok: false, hata: 'Yanıt çözümlenemedi', agHatasi: true }); }
      });
    });
    req.on('error', e => resolve({ ok: false, hata: e.message, agHatasi: true }));
    req.setTimeout(20000, () => req.destroy(new Error('zaman aşımı')));
    req.write(body); req.end();
  });
}

// Ağ kaynaklı geçici hatalarda (socket hang up vb.) 2 kez daha dener
async function geminiPing(key) {
  let son;
  for (let i = 0; i < 3; i++) {
    son = await geminiPingTek(key);
    if (son.ok || son.agHatasi === false) return son; // başarı ya da KESİN geçersizlik → bitir
    await new Promise(r => setTimeout(r, 1500));
  }
  return son;
}

const app = express();
app.use(express.json({ limit: '4mb' }));

app.get('/', (req, res) => {
  res.type('html').send(arayuzOku('setup.html'));
});

// 1) Makine kimliği
app.get('/api/setup/machine', (req, res) => res.json({ machineId: machineId() }));

// 2) Lisans doğrula + kaydet
app.post('/api/setup/license', (req, res) => {
  const lisans = (req.body?.license || '').trim();
  const sonuc = verifyLicense(lisans);
  if (!sonuc.ok) return res.status(400).json({ error: sonuc.reason });
  fs.writeFileSync(LICENSE_PATH, lisans, 'utf8');
  res.json({ ok: true, name: sonuc.data.name || '', exp: sonuc.data.exp });
});

// 3) Gemini anahtarları test et + sakla
app.post('/api/setup/gemini', async (req, res) => {
  const keys = (req.body?.keys || []).map(s => String(s).trim()).filter(Boolean);
  if (!keys.length) return res.status(400).json({ error: 'En az bir API anahtarı gir.' });
  const sonuclar = [];
  for (const k of keys) sonuclar.push({ key: k.slice(0, 10) + '…', ...(await geminiPing(k)) });
  const gecerli = keys.filter((k, i) => sonuclar[i].ok);
  if (!gecerli.length) return res.status(400).json({ error: 'Hiçbir anahtar çalışmadı. Anahtarı ve "Generative Language API"nin açık olduğunu kontrol et.', sonuclar });
  gecici.keys = gecerli;
  res.json({ ok: true, gecerliSayisi: gecerli.length, sonuclar });
});

// 4) OAuth bilgilerini al, yetkilendirme linki üret
app.post('/api/setup/oauth-url', (req, res) => {
  let client_id = (req.body?.client_id || '').trim();
  let client_secret = (req.body?.client_secret || '').trim();
  // credentials.json yapıştırılmışsa ayıkla
  if (req.body?.json) {
    try {
      const j = JSON.parse(req.body.json);
      const o = j.installed || j.web || j;
      client_id = o.client_id || client_id;
      client_secret = o.client_secret || client_secret;
    } catch { return res.status(400).json({ error: 'credentials.json çözümlenemedi.' }); }
  }
  if (!client_id || !client_secret) return res.status(400).json({ error: 'Client ID ve Client Secret gerekli.' });
  gecici.oauth = { client_id, client_secret };
  oauthClient = new google.auth.OAuth2(client_id, client_secret, REDIRECT);
  const url = oauthClient.generateAuthUrl({ access_type: 'offline', scope: SCOPES, prompt: 'consent' });
  res.json({ ok: true, url });
});

// OAuth dönüşü (Google buraya yönlendirir)
app.get('/oauth2callback', async (req, res) => {
  const code = req.query.code;
  if (!code || !oauthClient) {
    return res.status(400).send('<h2>Yetkilendirme başarısız. Kurulum sayfasına dönüp tekrar deneyin.</h2>');
  }
  try {
    const { tokens } = await oauthClient.getToken(code);
    fs.writeFileSync(TOKEN_PATH, JSON.stringify(tokens), 'utf8');
    gecici.tokenAlindi = true;
    res.send(`<!DOCTYPE html><html><head><meta charset="utf-8"><style>
      body{font-family:system-ui;background:#D9D9D2;display:flex;align-items:center;justify-content:center;height:100vh;margin:0}
      .k{background:#fff;border-radius:24px;padding:40px;text-align:center;box-shadow:0 10px 40px rgba(0,0,0,.12)}
      h2{color:#1C1C1A}.l{color:#5C701F}</style></head><body><div class="k">
      <h2>✅ Gmail başarıyla bağlandı!</h2><p class="l">Bu sekmeyi kapatıp kuruluma devam edebilirsiniz.</p>
      <script>setTimeout(()=>window.close(),2500)</script></div></body></html>`);
  } catch (e) {
    res.status(500).send('<h2>Token alınamadı: ' + e.message + '</h2>');
  }
});

app.get('/api/setup/gmail-status', (req, res) => res.json({ bagli: gecici.tokenAlindi }));

// 5) Kurulumu bitir
app.post('/api/setup/finish', (req, res) => {
  if (!fs.existsSync(LICENSE_PATH)) return res.status(400).json({ error: 'Lisans adımı tamamlanmadı.' });
  if (!gecici.keys) return res.status(400).json({ error: 'Gemini adımı tamamlanmadı.' });
  if (!gecici.tokenAlindi) return res.status(400).json({ error: 'Gmail bağlantısı tamamlanmadı.' });

  const profil = {
    ad: (req.body?.ad || 'Kullanıcı').trim(),
    unvan: (req.body?.unvan || '').trim(),
    alt: (req.body?.alt || '').trim(),
    avatar: req.body?.avatar || '',
  };
  // config
  fs.writeFileSync(CONFIG_PATH, JSON.stringify({
    geminiKeys: gecici.keys,
    oauth: gecici.oauth,
    kurulumTamam: true,
    kurulumTarihi: new Date().toISOString(),
  }, null, 2), 'utf8');
  // profili memory'ye işle
  let memory = {};
  try { memory = JSON.parse(fs.readFileSync(MEMORY_PATH, 'utf8')); } catch {}
  memory.profil = profil;
  fs.writeFileSync(MEMORY_PATH, JSON.stringify(memory, null, 2), 'utf8');

  res.json({ ok: true });
  // Kurulum sunucusunu kapat, asıl uygulamayı başlat
  setTimeout(() => httpServer.close(() => {
    console.log('\n✓ Kurulum tamamlandı — DAİ Mail Asistanı başlatılıyor...\n');
    require('./server.js');
  }), 1500);
});

const httpServer = app.listen(PORT, () => {
  console.log(`\n  🚀 DAİ Kurulum Sihirbazı → http://localhost:${PORT}\n`);
});

module.exports = httpServer;
