import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { EsgMetrica } from './entities/esg-metrica.entity';
import { EsgMeta } from './entities/esg-meta.entity';

@Injectable()
export class EsgService {
  constructor(
    @InjectRepository(EsgMetrica) private metricaRepo: Repository<EsgMetrica>,
    @InjectRepository(EsgMeta) private metaRepo: Repository<EsgMeta>,
  ) {}

  async findMetricas(q: any) {
    const qb = this.metricaRepo.createQueryBuilder('m');
    if (q.tipo) qb.andWhere('m.tipo = :tipo', { tipo: q.tipo });
    if (q.ano) qb.andWhere('m.periodo_ano = :ano', { ano: q.ano });
    if (q.mes) qb.andWhere('m.periodo_mes = :mes', { mes: q.mes });
    if (q.local_id) qb.andWhere('m.local_id = :local_id', { local_id: q.local_id });
    return qb.orderBy('m.periodo_ano', 'DESC').addOrderBy('m.periodo_mes', 'DESC').getMany();
  }

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

  async updateMetrica(id: string, dto: any) {
    await this.metricaRepo.update(id, dto);
    return this.metricaRepo.findOneBy({ id });
  }

  async resumo(q: any) {
    const ano = q.ano || new Date().getFullYear();
    const rows = await this.metricaRepo.createQueryBuilder('m')
      .select('m.tipo', 'tipo')
      .addSelect('m.unidade_medida', 'unidade')
      .addSelect('SUM(m.valor)', 'total')
      .addSelect('AVG(m.valor)', 'media')
      .addSelect('COUNT(*)', 'registros')
      .where('m.periodo_ano = :ano', { ano })
      .groupBy('m.tipo')
      .addGroupBy('m.unidade_medida')
      .getRawMany();
    return rows;
  }

  async findMetas(q: any) {
    const qb = this.metaRepo.createQueryBuilder('m');
    if (q.ano) qb.andWhere('m.periodo_ano = :ano', { ano: q.ano });
    if (q.tipo) qb.andWhere('m.tipo = :tipo', { tipo: q.tipo });
    return qb.getMany();
  }

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

  async dashboard(q: any) {
    const ano = q.ano || new Date().getFullYear();
    const metricas = await this.metricaRepo.createQueryBuilder('m')
      .select('m.tipo', 'tipo')
      .addSelect('m.periodo_mes', 'mes')
      .addSelect('SUM(m.valor)', 'total')
      .where('m.periodo_ano = :ano', { ano })
      .groupBy('m.tipo')
      .addGroupBy('m.periodo_mes')
      .orderBy('m.periodo_mes', 'ASC')
      .getRawMany();

    const metas = await this.metaRepo.find({ where: { periodo_ano: ano } });
    const resumo = await this.resumo({ ano });

    return { ano, metricas_por_mes: metricas, metas, resumo };
  }
}
