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

export class SocialController {
  // Obter todas as redes sociais ativas
  public static async getAll(req: Request, res: Response): Promise<void> {
    try {
      const socialRepository = AppDataSource.getRepository(Social);
      const socials = await socialRepository.find({
        where: { active: true },
        order: { id: 'DESC' }
      });
      
      res.json({ success: true, data: socials });
    } catch (error) {
      console.error('Erro ao buscar redes sociais:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao buscar redes sociais' 
      });
    }
  }

  // Obter uma rede social específica por ID
  public static async getById(req: Request, res: Response): Promise<void> {
    try {
      const id = parseInt(req.params.id);
      const socialRepository = AppDataSource.getRepository(Social);
      
      const social = await socialRepository.findOne({
        where: { id, active: true }
      });
      
      if (!social) {
        res.status(404).json({ 
          success: false, 
          message: 'Rede social não encontrada' 
        });
        return;
      }
      
      res.json({ success: true, data: social });
    } catch (error) {
      console.error('Erro ao buscar rede social:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao buscar rede social' 
      });
    }
  }

  // Criar uma nova rede social
  public static async create(req: Request, res: Response): Promise<void> {
    try {
      const { name, url, icon } = req.body;
      
      if (!name || !url) {
        res.status(400).json({ 
          success: false, 
          message: 'Nome e URL são obrigatórios' 
        });
        return;
      }
      
      const socialRepository = AppDataSource.getRepository(Social);
      const social = new Social();
      social.name = name;
      social.url = url;
      social.icon = icon || '';
      social.active = true;
      
      await socialRepository.save(social);
      
      res.status(201).json({ 
        success: true, 
        message: 'Rede social criada com sucesso', 
        data: social 
      });
    } catch (error) {
      console.error('Erro ao criar rede social:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao criar rede social' 
      });
    }
  }

  // Atualizar uma rede social existente
  public static async update(req: Request, res: Response): Promise<void> {
    try {
      const id = parseInt(req.params.id);
      const { name, url, icon, active } = req.body;
      
      const socialRepository = AppDataSource.getRepository(Social);
      const social = await socialRepository.findOneBy({ id });
      
      if (!social) {
        res.status(404).json({ 
          success: false, 
          message: 'Rede social não encontrada' 
        });
        return;
      }
      
      if (name) social.name = name;
      if (url) social.url = url;
      if (icon !== undefined) social.icon = icon;
      if (active !== undefined) social.active = active;
      
      await socialRepository.save(social);
      
      res.json({ 
        success: true, 
        message: 'Rede social atualizada com sucesso', 
        data: social 
      });
    } catch (error) {
      console.error('Erro ao atualizar rede social:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao atualizar rede social' 
      });
    }
  }

  // Excluir uma rede social
  public static async delete(req: Request, res: Response): Promise<void> {
    try {
      const id = parseInt(req.params.id);
      
      const socialRepository = AppDataSource.getRepository(Social);
      const social = await socialRepository.findOneBy({ id });
      
      if (!social) {
        res.status(404).json({ 
          success: false, 
          message: 'Rede social não encontrada' 
        });
        return;
      }
      
      await socialRepository.remove(social);
      
      res.json({ 
        success: true, 
        message: 'Rede social excluída com sucesso' 
      });
    } catch (error) {
      console.error('Erro ao excluir rede social:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao excluir rede social' 
      });
    }
  }

  // Registrar clique em uma rede social
  public static async trackClick(req: Request, res: Response): Promise<void> {
    try {
      const id = parseInt(req.params.id);
      
      const socialRepository = AppDataSource.getRepository(Social);
      const social = await socialRepository.findOne({
        where: { id, active: true }
      });
      
      if (!social) {
        res.status(404).json({ 
          success: false, 
          message: 'Rede social não encontrada ou inativa' 
        });
        return;
      }
      
      // Obter informações do cliente
      const clientInfo = getClientInfo(req);
      
      // Registrar o clique
      const socialClickRepository = AppDataSource.getRepository(SocialClick);
      const socialClick = new SocialClick();
      socialClick.social_id = social.id;
      socialClick.visitor_ip = clientInfo.ip;
      socialClick.visitor_device_type = clientInfo.deviceType;
      socialClick.visitor_user_agent = clientInfo.userAgent;
      socialClick.visitor_referrer = clientInfo.referrer;
      
      await socialClickRepository.save(socialClick);
      
      // Redirecionar para a URL da rede social
      res.redirect(social.url);
    } catch (error) {
      console.error('Erro ao registrar clique:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao processar clique na rede social' 
      });
    }
  }
}
