import type { APIRoute } from 'astro';
import crypto from 'crypto';

const PB_POCKETBASE_URL = import.meta.env.PB_POCKETBASE_URL || 'http://127.0.0.1:8090';

function getClientIp(request: Request): string {
  const forwarded = request.headers.get('x-forwarded-for');
  if (forwarded) {
    return forwarded.split(',')[0].trim();
  }
  const realIp = request.headers.get('x-real-ip');
  if (realIp) {
    return realIp;
  }
  const host = request.headers.get('host') || 'localhost';
  return host.includes('localhost') || host.includes('127.0.0.1') ? 'localhost' : 'unknown';
}

function generateVisitorHash(ip: string, userAgent: string): string {
  // Упрощаем - используем только IP (без порта) для стабильности
  const stableIP = ip.split(':').pop() || ip;
  // Используем только первые 2 слова из userAgent (браузер + платформа)
  const uaParts = userAgent.split(' ');
  const stableUA = uaParts.slice(0, 2).join(' ');
  return crypto.createHash('sha256').update(stableIP + stableUA).digest('hex').slice(0, 32);
}

async function pbRequest(method: string, path: string, body?: object) {
  const url = `${PB_POCKETBASE_URL}${path}`;
  const options: RequestInit = {
    method,
    headers: { 
      'Content-Type': 'application/json',
      'Origin': 'http://127.0.0.1:4321',
    },
  };
  if (body) options.body = JSON.stringify(body);
  
  const res = await fetch(url, options);
  if (!res.ok) {
    const err = await res.text();
    throw new Error(`PB ${method} ${path}: ${res.status} - ${err}`);
  }
  return res.json();
}

function jsonResponse(data: object, status = 200): Response {
  return new Response(JSON.stringify(data), {
    status,
    headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' }
  });
}

export const GET: APIRoute = async ({ request }) => {
  try {
    const url = new URL(request.url);
    const isRepeatVisit = url.searchParams.get('repeat') === 'true';

    const ip = getClientIp(request);
    const userAgent = request.headers.get('user-agent') || 'unknown';
    const visitorHash = generateVisitorHash(ip, userAgent);

    const now = new Date();
    // Начало текущего дня по UTC (00:00 UTC)
    const todayStart = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), 0, 0, 0, 0));
    // PocketBase использует формат YYYY-MM-DD HH:MM:SS
    const todayStartStr = todayStart.toISOString().replace('T', ' ').replace('Z', '');

    // Проверяем был ли посетитель сегодня (с 00:00 UTC)
    const filterTodayVisitor = `visitor_hash="${visitorHash}" && created >= "${todayStartStr}"`;

    let existingVisitor;
    try {
      const res = await pbRequest('GET', `/api/collections/site_visitors/records?filter=${encodeURIComponent(filterTodayVisitor)}&perPage=1`);
      existingVisitor = { totalItems: res.totalItems || 0 };
    } catch {
      existingVisitor = { totalItems: 0 };
    }

    let isNewVisitor = false;

    // Если это повторный визит по данным клиента - не создаём запись
    if (isRepeatVisit) {
      isNewVisitor = false;
    }
    // Создаём запись только если НЕ было посещения сегодня
    else if (existingVisitor.totalItems === 0) {
      isNewVisitor = true;
      try {
        await pbRequest('POST', '/api/collections/site_visitors/records', {
          visitor_hash: visitorHash,
          ip: ip,
          user_agent: userAgent,
        });
      } catch {
        // ignore
      }
    }

    // Получаем статистику за сегодня (с 00:00 UTC)
    const filterToday = `created >= "${todayStartStr}"`;
    let todayCount = 0;
    let totalCount = 0;
    
    try {
      const resToday = await pbRequest('GET', `/api/collections/site_visitors/records?filter=${encodeURIComponent(filterToday)}&perPage=1`);
      todayCount = resToday.totalItems || 0;
    } catch {
      todayCount = 0;
    }

    try {
      const resTotal = await pbRequest('GET', '/api/collections/site_visitors/records?perPage=1');
      totalCount = resTotal.totalItems || 0;
    } catch {
      totalCount = 0;
    }

    return jsonResponse({ todayVisitors: todayCount, totalVisitors: totalCount, isNewVisitor }, 200);

  } catch (error) {
    console.error('[Visitors] Error:', error);
    return jsonResponse({ error: 'Внутренняя ошибка сервера' }, 500);
  }
};