import { Injectable, BadRequestException } from '@nestjs/common';
import { DataSource } from 'typeorm';
import * as XLSX from 'xlsx';

@Injectable()
export class ImportService {
  constructor(private ds: DataSource) {}

  async importExcel(file: any, tipo: string) {
    if (!file) throw new BadRequestException('Nenhum arquivo enviado');
    if (!tipo || !['orcamento', 'demandas'].includes(tipo)) {
      throw new BadRequestException('Tipo deve ser "orcamento" ou "demandas"');
    }

    const wb = XLSX.read(file.buffer, { type: 'buffer' });
    const sheet = wb.Sheets[wb.SheetNames[0]];
    const rows: any[] = XLSX.utils.sheet_to_json(sheet);

    if (!rows.length) throw new BadRequestException('Planilha vazia');

    const errors: string[] = [];
    const valid: any[] = [];

    if (tipo === 'orcamento') {
      const required = ['ano', 'mes', 'centro_custo_id', 'categoria_id', 'valor_planejado'];
      rows.forEach((r, i) => {
        const missing = required.filter(f => r[f] === undefined || r[f] === '');
        if (missing.length) { errors.push(`Linha ${i + 2}: campos faltando: ${missing.join(', ')}`); }
        else { valid.push(r); }
      });
    } else {
      const required = ['titulo', 'local_id', 'centro_custo_id', 'categoria_id', 'criticidade', 'solicitante_id'];
      rows.forEach((r, i) => {
        const missing = required.filter(f => r[f] === undefined || r[f] === '');
        if (missing.length) { errors.push(`Linha ${i + 2}: campos faltando: ${missing.join(', ')}`); }
        else { valid.push({ ...r, status: r.status || 'rascunho' }); }
      });
    }

    if (errors.length && !valid.length) {
      return { sucesso: false, erros: errors, importados: 0 };
    }

    const table = tipo === 'orcamento' ? 'orcamento_planejado' : 'demandas';
    let importados = 0;
    for (const row of valid) {
      try {
        const cols = Object.keys(row);
        const vals = cols.map(c => row[c]);
        const placeholders = cols.map(() => '?').join(',');
        await this.ds.query(`INSERT INTO ${table} (${cols.join(',')}) VALUES (${placeholders})`, vals);
        importados++;
      } catch (e: any) {
        errors.push(`Erro ao inserir: ${e.message}`);
      }
    }

    return { sucesso: true, importados, erros: errors, total_linhas: rows.length };
  }
}
