import { DataSource } from 'typeorm';
import env from './env';
import { Link } from '../models/Link';
import { Banner } from '../models/Banner';
import { Social } from '../models/Social';
import { LinkClick } from '../models/LinkClick';
import { BannerClick } from '../models/BannerClick';
import { SocialClick } from '../models/SocialClick';
import { PageView } from '../models/PageView';
import { SectionView } from '../models/SectionView';

// Configuração da conexão com o banco de dados usando TypeORM
export const AppDataSource = new DataSource({
  type: 'mysql',
  host: env.DB_HOST,
  port: env.DB_PORT,
  username: env.DB_USER,
  password: env.DB_PASS,
  database: env.DB_NAME,
  synchronize: false, // Não sincroniza automaticamente em produção
  logging: env.DEBUG_MODE,
  entities: [
    Link,
    Banner,
    Social,
    LinkClick,
    BannerClick,
    SocialClick,
    PageView,
    SectionView
  ],
  migrations: [],
  subscribers: [],
});

// Função para inicializar a conexão com o banco de dados
export const initializeDatabase = async (): Promise<void> => {
  try {
    await AppDataSource.initialize();
    console.log('Conexão com o banco de dados estabelecida com sucesso');
  } catch (error) {
    console.error('Erro ao conectar ao banco de dados:', error);
    throw error;
  }
};

// Função para verificar se uma tabela existe
export const tableExists = async (tableName: string): Promise<boolean> => {
  try {
    const result = await AppDataSource.query(
      `SHOW TABLES LIKE '${tableName}'`
    );
    return result.length > 0;
  } catch (error) {
    console.error(`Erro ao verificar se a tabela ${tableName} existe:`, error);
    return false;
  }
};

// Função para verificar se uma coluna existe em uma tabela
export const columnExists = async (
  tableName: string,
  columnName: string
): Promise<boolean> => {
  try {
    if (!(await tableExists(tableName))) {
      return false;
    }
    
    const result = await AppDataSource.query(
      `SHOW COLUMNS FROM ${tableName} LIKE '${columnName}'`
    );
    return result.length > 0;
  } catch (error) {
    console.error(
      `Erro ao verificar se a coluna ${columnName} existe na tabela ${tableName}:`,
      error
    );
    return false;
  }
};

// Função para executar consultas SQL com segurança
export const executeQuery = async (
  sql: string,
  params: any[] = []
): Promise<any> => {
  try {
    return await AppDataSource.query(sql, params);
  } catch (error) {
    console.error('Erro ao executar consulta:', error);
    throw error;
  }
};
