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

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

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

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

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

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

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