import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, DataSource } from 'typeorm';
import { Kpi } from './entities/kpi.entity';

@Injectable()
export class KpisService {
  constructor(
    @InjectRepository(Kpi) private kpiRepo: Repository<Kpi>,
    private ds: DataSource,
  ) {}

  async findAll(q: any) {
    const qb = this.kpiRepo.createQueryBuilder('k');
    if (q.categoria) qb.andWhere('k.categoria = :cat', { cat: q.categoria });
    if (q.ano) qb.andWhere('k.periodo_ano = :ano', { ano: q.ano });
    if (q.centro_custo_id) qb.andWhere('k.centro_custo_id = :cc', { cc: q.centro_custo_id });
    return qb.orderBy('k.categoria', 'ASC').getMany();
  }

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

  async dashboard(q: any) {
    const ano = q.ano || new Date().getFullYear();
    const mes = q.mes || new Date().getMonth() + 1;

    // Auto-calculated KPIs
    const calculated: any[] = [];

    // % budget consumed
    try {
      const [budget] = await this.ds.query(`
        SELECT COALESCE(SUM(valor_planejado),0) as planejado, COALESCE(SUM(valor_realizado),0) as realizado
        FROM orcamento_planejado WHERE ano = ? AND mes = ?`, [ano, mes]);
      if (budget && budget.planejado > 0) {
        const pct = (budget.realizado / budget.planejado) * 100;
        calculated.push({ nome: '% Orçamento Consumido', categoria: 'financeiro', unidade: '%', valor_atual: Math.round(pct * 100) / 100, meta_valor: 100, status: pct > 90 ? 'vermelho' : pct > 70 ? 'amarelo' : 'verde' });
      }
    } catch(e) {}

    // Avg time to close OS
    try {
      const [osTime] = await this.ds.query(`
        SELECT AVG(julianday(data_conclusao) - julianday(data_inicio)) as avg_dias
        FROM ordens_servico WHERE status = 'concluida' AND data_inicio IS NOT NULL AND data_conclusao IS NOT NULL`);
      if (osTime && osTime.avg_dias) {
        calculated.push({ nome: 'Tempo Médio Fechamento OS', categoria: 'prazo', unidade: 'dias', valor_atual: Math.round(osTime.avg_dias * 10) / 10, meta_valor: 15, status: osTime.avg_dias > 20 ? 'vermelho' : osTime.avg_dias > 15 ? 'amarelo' : 'verde' });
      }
    } catch(e) {}

    // Supplier rating avg
    try {
      const [rating] = await this.ds.query(`SELECT AVG(nota) as avg_nota FROM avaliacoes`);
      if (rating && rating.avg_nota) {
        calculated.push({ nome: 'Nota Média Fornecedores', categoria: 'qualidade', unidade: 'nota', valor_atual: Math.round(rating.avg_nota * 10) / 10, meta_valor: 4.0, status: rating.avg_nota < 3 ? 'vermelho' : rating.avg_nota < 3.5 ? 'amarelo' : 'verde' });
      }
    } catch(e) {}

    // Demand completion rate
    try {
      const [demandas] = await this.ds.query(`
        SELECT COUNT(*) as total, SUM(CASE WHEN status IN ('concluida','finalizada') THEN 1 ELSE 0 END) as concluidas
        FROM demandas`);
      if (demandas && demandas.total > 0) {
        const rate = (demandas.concluidas / demandas.total) * 100;
        calculated.push({ nome: 'Taxa Conclusão Demandas', categoria: 'operacional', unidade: '%', valor_atual: Math.round(rate * 100) / 100, meta_valor: 80, status: rate < 50 ? 'vermelho' : rate < 70 ? 'amarelo' : 'verde' });
      }
    } catch(e) {}

    const stored = await this.kpiRepo.find({ where: { periodo_ano: ano } });
    return { ano, mes, kpis_calculados: calculated, kpis_cadastrados: stored };
  }
}
