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

export class LinkController {
  // Obter todos os links ativos
  public static async getAll(req: Request, res: Response): Promise<void> {
    try {
      const linkRepository = AppDataSource.getRepository(Link);
      const links = await linkRepository.find({
        where: { active: true },
        order: { id: 'DESC' }
      });
      
      res.json({ success: true, data: links });
    } catch (error) {
      console.error('Erro ao buscar links:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao buscar links' 
      });
    }
  }

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

  // Criar um novo link
  public static async create(req: Request, res: Response): Promise<void> {
    try {
      const { title, url, description } = req.body;
      
      if (!title || !url) {
        res.status(400).json({ 
          success: false, 
          message: 'Título e URL são obrigatórios' 
        });
        return;
      }
      
      const linkRepository = AppDataSource.getRepository(Link);
      const link = new Link();
      link.title = title;
      link.url = url;
      link.description = description || '';
      link.active = true;
      
      await linkRepository.save(link);
      
      res.status(201).json({ 
        success: true, 
        message: 'Link criado com sucesso', 
        data: link 
      });
    } catch (error) {
      console.error('Erro ao criar link:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao criar link' 
      });
    }
  }

  // Atualizar um link existente
  public static async update(req: Request, res: Response): Promise<void> {
    try {
      const id = parseInt(req.params.id);
      const { title, url, description, active } = req.body;
      
      const linkRepository = AppDataSource.getRepository(Link);
      const link = await linkRepository.findOneBy({ id });
      
      if (!link) {
        res.status(404).json({ 
          success: false, 
          message: 'Link não encontrado' 
        });
        return;
      }
      
      if (title) link.title = title;
      if (url) link.url = url;
      if (description !== undefined) link.description = description;
      if (active !== undefined) link.active = active;
      
      await linkRepository.save(link);
      
      res.json({ 
        success: true, 
        message: 'Link atualizado com sucesso', 
        data: link 
      });
    } catch (error) {
      console.error('Erro ao atualizar link:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao atualizar link' 
      });
    }
  }

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

  // Registrar clique em um link
  public static async trackClick(req: Request, res: Response): Promise<void> {
    try {
      const id = parseInt(req.params.id);
      
      const linkRepository = AppDataSource.getRepository(Link);
      const link = await linkRepository.findOne({
        where: { id, active: true }
      });
      
      if (!link) {
        res.status(404).json({ 
          success: false, 
          message: 'Link não encontrado ou inativo' 
        });
        return;
      }
      
      // Obter informações do cliente
      const clientInfo = getClientInfo(req);
      
      // Registrar o clique
      const linkClickRepository = AppDataSource.getRepository(LinkClick);
      const linkClick = new LinkClick();
      linkClick.link_id = link.id;
      linkClick.visitor_ip = clientInfo.ip;
      linkClick.visitor_device_type = clientInfo.deviceType;
      linkClick.visitor_user_agent = clientInfo.userAgent;
      linkClick.visitor_referrer = clientInfo.referrer;
      
      await linkClickRepository.save(linkClick);
      
      // Redirecionar para a URL do link
      res.redirect(link.url);
    } catch (error) {
      console.error('Erro ao registrar clique:', error);
      res.status(500).json({ 
        success: false, 
        message: 'Erro ao processar clique no link' 
      });
    }
  }
}
