import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, DataSource } from 'typeorm';
import { AlertaConfig } from './entities/alerta-config.entity';
import { Alerta } from '../dashboard/entities/alerta.entity';

@Injectable()
export class AlertasService {
  constructor(
    @InjectRepository(AlertaConfig) private configRepo: Repository<AlertaConfig>,
    @InjectRepository(Alerta) private alertaRepo: Repository<Alerta>,
    private ds: DataSource,
  ) {}

  async getConfigs() { return this.configRepo.find(); }

  async configurar(dto: any) {
    return this.configRepo.save(this.configRepo.create(dto));
  }

  async verificarAlertas() {
    const configs = await this.configRepo.find({ where: { ativo: true } });
    const gerados: any[] = [];

    for (const cfg of configs) {
      if (cfg.tipo === 'orcamento_excedido') {
        const rows = await this.ds.query(`
          SELECT centro_custo_id, SUM(valor_realizado) as realizado, SUM(valor_planejado) as planejado
          FROM orcamento_planejado
          ${cfg.centro_custo_id ? 'WHERE centro_custo_id = ?' : ''}
          GROUP BY centro_custo_id
          HAVING (SUM(valor_realizado) / SUM(valor_planejado) * 100) > ?`,
          cfg.centro_custo_id ? [cfg.centro_custo_id, cfg.limite_percentual] : [cfg.limite_percentual]);
        for (const r of rows) {
          const pct = Math.round((r.realizado / r.planejado) * 100);
          gerados.push({ tipo: 'orcamento_excedido', titulo: `Orçamento excedeu ${pct}%`, mensagem: `Centro de custo ${r.centro_custo_id} atingiu ${pct}% do orçamento`, entidade: 'orcamento', usuario_id: 'system' });
        }
      }

      if (cfg.tipo === 'certidao_vencendo') {
        const rows = await this.ds.query(`
          SELECT c.*, f.razao_social FROM certidoes c
          LEFT JOIN fornecedores f ON f.id = c.fornecedor_id
          WHERE c.data_validade <= date('now', '+30 days') AND c.data_validade >= date('now')`);
        for (const r of rows) {
          gerados.push({ tipo: 'certidao_vencendo', titulo: `Certidão vencendo: ${r.tipo}`, mensagem: `Fornecedor ${r.razao_social} - certidão ${r.tipo} vence em ${r.data_validade}`, entidade: 'certidao', entidade_id: r.id, usuario_id: 'system' });
        }
      }

      if (cfg.tipo === 'os_atrasada') {
        const rows = await this.ds.query(`
          SELECT * FROM ordens_servico
          WHERE status NOT IN ('concluida','cancelada') AND data_conclusao IS NOT NULL AND data_conclusao < date('now')`);
        for (const r of rows) {
          gerados.push({ tipo: 'os_atrasada', titulo: `OS #${r.numero} atrasada`, mensagem: `Ordem de serviço #${r.numero} passou da data prevista`, entidade: 'ordem_servico', entidade_id: r.id, usuario_id: 'system' });
        }
      }
    }

    // Save generated alerts
    for (const a of gerados) {
      await this.alertaRepo.save(this.alertaRepo.create(a));
    }

    return { alertas_gerados: gerados.length, detalhes: gerados };
  }
}
