import { Request, Response } from 'express';
import { AppDataSource } from '../config/database';
import { PageView } from '../models/PageView';
import { SectionView } from '../models/SectionView';
import { getClientInfo } from '../utils/clientInfo';

export class TrackingController {
  // Registrar visualização de página
  public static async trackPageView(req: Request, res: Response): Promise<void> {
    try {
      const { page_url } = req.body;
      
      if (!page_url) {
        res.status(400).json({ 
          success: false, 
          message: 'URL da página é obrigatória' 
        });
        return;
      }
      
      // Obter informações do cliente
      const clientInfo = getClientInfo(req);
      
      // Gerar ID de sessão se não existir
      const sessionId = req.cookies?.session_id || 
                        Math.random().toString(36).substring(2, 15) + 
                        Math.random().toString(36).substring(2, 15);
      
      // Definir cookie de sessão se não existir
      if (!req.cookies?.session_id) {
        res.cookie('session_id', sessionId, { 
          maxAge: 24 * 60 * 60 * 1000, // 24 horas
          httpOnly: true,
          secure: process.env.NODE_ENV === 'production'
        });
      }
      
      // Registrar a visualização de página
      const pageViewRepository = AppDataSource.getRepository(PageView);
      const pageView = new PageView();
      pageView.page_url = page_url;
      pageView.visitor_ip = clientInfo.ip;
      pageView.visitor_device_type = clientInfo.deviceType;
      pageView.visitor_user_agent = clientInfo.userAgent;
      pageView.visitor_referrer = clientInfo.referrer;
      pageView.session_id = sessionId;
      
      await pageViewRepository.save(pageView);
      
      res.json({ 
        success: true, 
        message: 'Visualização de página registrada com sucesso' 
      });
    } catch (error) {
      console.error('Erro ao registrar visualização de página:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao registrar visualização de página' 
      });
    }
  }

  // Registrar visualização de seção
  public static async trackSectionView(req: Request, res: Response): Promise<void> {
    try {
      const { section_name, page_url, view_duration } = req.body;
      
      if (!section_name || !page_url) {
        res.status(400).json({ 
          success: false, 
          message: 'Nome da seção e URL da página são obrigatórios' 
        });
        return;
      }
      
      // Obter informações do cliente
      const clientInfo = getClientInfo(req);
      
      // Obter ID de sessão
      const sessionId = req.cookies?.session_id || 
                        Math.random().toString(36).substring(2, 15) + 
                        Math.random().toString(36).substring(2, 15);
      
      // Registrar a visualização de seção
      const sectionViewRepository = AppDataSource.getRepository(SectionView);
      const sectionView = new SectionView();
      sectionView.section_name = section_name;
      sectionView.page_url = page_url;
      sectionView.visitor_ip = clientInfo.ip;
      sectionView.visitor_device_type = clientInfo.deviceType;
      sectionView.visitor_user_agent = clientInfo.userAgent;
      sectionView.session_id = sessionId;
      sectionView.view_duration = view_duration || 0;
      
      await sectionViewRepository.save(sectionView);
      
      res.json({ 
        success: true, 
        message: 'Visualização de seção registrada com sucesso' 
      });
    } catch (error) {
      console.error('Erro ao registrar visualização de seção:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao registrar visualização de seção' 
      });
    }
  }

  // Obter estatísticas de visualizações de página
  public static async getPageViewStats(req: Request, res: Response): Promise<void> {
    try {
      const { start_date, end_date } = req.query;
      
      let whereClause = '';
      const params: any[] = [];
      
      if (start_date && end_date) {
        whereClause = 'WHERE view_date BETWEEN ? AND ?';
        params.push(start_date, end_date);
      }
      
      const query = `
        SELECT 
          page_url, 
          COUNT(*) as view_count,
          COUNT(DISTINCT visitor_ip) as unique_visitors,
          COUNT(DISTINCT session_id) as unique_sessions
        FROM 
          page_views
        ${whereClause}
        GROUP BY 
          page_url
        ORDER BY 
          view_count DESC
      `;
      
      const stats = await AppDataSource.query(query, params);
      
      res.json({ 
        success: true, 
        data: stats 
      });
    } catch (error) {
      console.error('Erro ao obter estatísticas de visualizações de página:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao obter estatísticas de visualizações de página' 
      });
    }
  }

  // Obter estatísticas de visualizações de seção
  public static async getSectionViewStats(req: Request, res: Response): Promise<void> {
    try {
      const { start_date, end_date, page_url } = req.query;
      
      let whereClause = '';
      const params: any[] = [];
      
      if (page_url) {
        whereClause = 'WHERE page_url = ?';
        params.push(page_url);
        
        if (start_date && end_date) {
          whereClause += ' AND view_date BETWEEN ? AND ?';
          params.push(start_date, end_date);
        }
      } else if (start_date && end_date) {
        whereClause = 'WHERE view_date BETWEEN ? AND ?';
        params.push(start_date, end_date);
      }
      
      const query = `
        SELECT 
          section_name, 
          COUNT(*) as view_count,
          AVG(view_duration) as avg_duration,
          MAX(view_duration) as max_duration
        FROM 
          section_views
        ${whereClause}
        GROUP BY 
          section_name
        ORDER BY 
          view_count DESC
      `;
      
      const stats = await AppDataSource.query(query, params);
      
      res.json({ 
        success: true, 
        data: stats 
      });
    } catch (error) {
      console.error('Erro ao obter estatísticas de visualizações de seção:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao obter estatísticas de visualizações de seção' 
      });
    }
  }
}
