import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { OrcamentoPlanejado } from './entities/orcamento-planejado.entity';
import { Categoria } from '../categorias/entities/categoria.entity';

@Injectable()
export class OrcamentoService {
  constructor(
    @InjectRepository(OrcamentoPlanejado) private repo: Repository<OrcamentoPlanejado>,
    @InjectRepository(Categoria) private categoriaRepo: Repository<Categoria>,
  ) {}

  async findAll(query?: any) {
    const where: any = {};
    if (query?.ano) where.ano = query.ano;
    if (query?.mes) where.mes = query.mes;
    if (query?.centro_custo_id) where.centro_custo_id = query.centro_custo_id;
    const items = await this.repo.find({ where });
    
    // Enrich with tipo_investimento from categoria
    const categorias = await this.categoriaRepo.find();
    const catMap: Record<string, string> = {};
    categorias.forEach(c => { catMap[c.id] = c.tipo_investimento || ''; });
    
    return items.map(item => ({
      ...item,
      tipo_investimento: catMap[item.categoria_id] || '',
    }));
  }

  findOne(id: string) { return this.repo.findOne({ where: { id } }); }
  create(data: Partial<OrcamentoPlanejado>) { return this.repo.save(data); }
  async update(id: string, data: Partial<OrcamentoPlanejado>) { await this.repo.update(id, data); return this.findOne(id); }
  async remove(id: string) { await this.repo.delete(id); return { deleted: true }; }

  async resumo(ano: number) {
    const items = await this.repo.find({ where: { ano } });
    const byMonth: any = {};
    for (const item of items) {
      if (!byMonth[item.mes]) byMonth[item.mes] = { mes: item.mes, planejado: 0, comprometido: 0, realizado: 0 };
      byMonth[item.mes].planejado += item.valor_planejado;
      byMonth[item.mes].comprometido += item.valor_comprometido;
      byMonth[item.mes].realizado += item.valor_realizado;
    }
    return Object.values(byMonth).sort((a: any, b: any) => a.mes - b.mes);
  }

  async resumoInvestimento(ano: number) {
    const items = await this.repo.find({ where: { ano } });
    const categorias = await this.categoriaRepo.find();
    const catMap: Record<string, string> = {};
    categorias.forEach(c => { catMap[c.id] = c.tipo_investimento || 'Não definido'; });

    const result: Record<string, { tipo: string; planejado: number; realizado: number; economia: number }> = {};
    for (const item of items) {
      const tipo = catMap[item.categoria_id] || 'Não definido';
      if (!result[tipo]) result[tipo] = { tipo, planejado: 0, realizado: 0, economia: 0 };
      result[tipo].planejado += item.valor_planejado;
      result[tipo].realizado += item.valor_realizado;
    }
    for (const r of Object.values(result)) {
      r.economia = r.planejado - r.realizado;
    }
    return Object.values(result);
  }
}
