import { Injectable, OnModuleInit } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, DataSource } from 'typeorm';
import * as bcrypt from 'bcryptjs';
import { v4 as uuid } from 'uuid';
import { Perfil } from '../../modules/users/entities/perfil.entity';
import { Usuario } from '../../modules/users/entities/usuario.entity';
import { Local } from '../../modules/locais/entities/local.entity';
import { CentroCusto } from '../../modules/centros-custo/entities/centro-custo.entity';
import { Categoria } from '../../modules/categorias/entities/categoria.entity';
import { Fornecedor } from '../../modules/fornecedores/entities/fornecedor.entity';
import { Certidao } from '../../modules/fornecedores/entities/certidao.entity';
import { Demanda } from '../../modules/demandas/entities/demanda.entity';
import { ItemLinha } from '../../modules/demandas/entities/item-linha.entity';
import { Proposta } from '../../modules/propostas/entities/proposta.entity';
import { OrcamentoPlanejado } from '../../modules/orcamento/entities/orcamento-planejado.entity';
import { WorkflowAprovacao } from '../../modules/workflow/entities/workflow-aprovacao.entity';
import { OrdemServico } from '../../modules/ordens-servico/entities/ordem-servico.entity';
import { Alerta } from '../../modules/dashboard/entities/alerta.entity';
import { EsgMetrica } from '../../modules/esg/entities/esg-metrica.entity';
import { EsgMeta } from '../../modules/esg/entities/esg-meta.entity';
import { Kpi } from '../../modules/kpis/entities/kpi.entity';
import { Meta } from '../../modules/metas/entities/meta.entity';
import { AlertaConfig } from '../../modules/alertas/entities/alerta-config.entity';
import { Subcategoria } from '../../modules/subcategorias/entities/subcategoria.entity';

@Injectable()
export class SeedService {
  constructor(
    @InjectRepository(Perfil) private perfilRepo: Repository<Perfil>,
    @InjectRepository(Usuario) private userRepo: Repository<Usuario>,
    @InjectRepository(Local) private localRepo: Repository<Local>,
    @InjectRepository(CentroCusto) private ccRepo: Repository<CentroCusto>,
    @InjectRepository(Categoria) private catRepo: Repository<Categoria>,
    @InjectRepository(Fornecedor) private fornRepo: Repository<Fornecedor>,
    @InjectRepository(Certidao) private certRepo: Repository<Certidao>,
    @InjectRepository(Demanda) private demandaRepo: Repository<Demanda>,
    @InjectRepository(ItemLinha) private itemRepo: Repository<ItemLinha>,
    @InjectRepository(Proposta) private propRepo: Repository<Proposta>,
    @InjectRepository(OrcamentoPlanejado) private orcRepo: Repository<OrcamentoPlanejado>,
    @InjectRepository(WorkflowAprovacao) private wfRepo: Repository<WorkflowAprovacao>,
    @InjectRepository(OrdemServico) private osRepo: Repository<OrdemServico>,
    @InjectRepository(Alerta) private alertaRepo: Repository<Alerta>,
    @InjectRepository(EsgMetrica) private esgMetricaRepo: Repository<EsgMetrica>,
    @InjectRepository(EsgMeta) private esgMetaRepo: Repository<EsgMeta>,
    @InjectRepository(Kpi) private kpiRepo: Repository<Kpi>,
    @InjectRepository(Meta) private metaRepo: Repository<Meta>,
    @InjectRepository(AlertaConfig) private alertaConfigRepo: Repository<AlertaConfig>,
    @InjectRepository(Subcategoria) private subcatRepo: Repository<Subcategoria>,
  ) {}

  async seed() {
    const existingPerfis = await this.perfilRepo.count();
    if (existingPerfis > 0) return;

    console.log('🌱 Seeding database...');
    const hash = await bcrypt.hash('123456', 10);

    // Perfis
    const perfis = [
      { id: uuid(), nome: 'solicitante', descricao: 'Solicitante de demandas', permissoes: {} },
      { id: uuid(), nome: 'gestor_facilities', descricao: 'Gestor de Facilities', permissoes: {} },
      { id: uuid(), nome: 'aprovador_financeiro', descricao: 'Aprovador Financeiro', permissoes: {} },
      { id: uuid(), nome: 'diretoria', descricao: 'Diretoria', permissoes: {} },
      { id: uuid(), nome: 'fornecedor', descricao: 'Fornecedor', permissoes: {} },
      { id: uuid(), nome: 'administrador', descricao: 'Administrador do Sistema', permissoes: {} },
    ];
    await this.perfilRepo.save(perfis);

    // Centros de Custo
    const ccs = [
      { id: uuid(), codigo: 'CC-001', nome: 'Sede Corporativa SP' },
      { id: uuid(), codigo: 'CC-002', nome: 'Filial Rio de Janeiro' },
      { id: uuid(), codigo: 'CC-003', nome: 'Centro de Distribuição MG' },
      { id: uuid(), codigo: 'CC-004', nome: 'Escritório Curitiba' },
      { id: uuid(), codigo: 'CC-005', nome: 'Fábrica Campinas' },
    ];
    await this.ccRepo.save(ccs);

    // Usuários
    const users = [
      { id: uuid(), nome: 'Admin Sistema', email: 'admin@hefesto.com', senha_hash: hash, perfil_id: perfis[5].id },
      { id: uuid(), nome: 'Maria Silva', email: 'maria.silva@hefesto.com', senha_hash: hash, perfil_id: perfis[0].id },
      { id: uuid(), nome: 'João Santos', email: 'joao.santos@hefesto.com', senha_hash: hash, perfil_id: perfis[1].id },
      { id: uuid(), nome: 'Ana Oliveira', email: 'ana.oliveira@hefesto.com', senha_hash: hash, perfil_id: perfis[2].id },
      { id: uuid(), nome: 'Carlos Mendes', email: 'carlos.mendes@hefesto.com', senha_hash: hash, perfil_id: perfis[3].id },
      { id: uuid(), nome: 'Roberto Lima', email: 'roberto.lima@hefesto.com', senha_hash: hash, perfil_id: perfis[0].id },
      { id: uuid(), nome: 'Fernanda Costa', email: 'fernanda.costa@hefesto.com', senha_hash: hash, perfil_id: perfis[1].id },
      { id: uuid(), nome: 'Paulo Rodrigues', email: 'paulo.rodrigues@hefesto.com', senha_hash: hash, perfil_id: perfis[4].id },
      { id: uuid(), nome: 'Luciana Ferreira', email: 'luciana.ferreira@hefesto.com', senha_hash: hash, perfil_id: perfis[4].id },
      { id: uuid(), nome: 'Ricardo Almeida', email: 'ricardo.almeida@hefesto.com', senha_hash: hash, perfil_id: perfis[4].id },
    ];
    await this.userRepo.save(users);

    // Locais
    const locais = [
      { id: uuid(), nome: 'Torre Norte - SP', endereco: 'Av. Paulista, 1000, São Paulo - SP', centro_custo_id: ccs[0].id, responsavel_id: users[2].id, tipo_operacao_local: 'Administrativo', classificacao_impacto_ambiental: 'Baixo', praticas_sustentaveis: ['Coleta Seletiva', 'Energia Renovável'] },
      { id: uuid(), nome: 'Torre Sul - SP', endereco: 'Av. Paulista, 1002, São Paulo - SP', centro_custo_id: ccs[0].id, responsavel_id: users[2].id, tipo_operacao_local: 'Administrativo', classificacao_impacto_ambiental: 'Baixo', praticas_sustentaveis: ['Coleta Seletiva'] },
      { id: uuid(), nome: 'Escritório RJ', endereco: 'Rua do Ouvidor, 50, Rio de Janeiro - RJ', centro_custo_id: ccs[1].id, responsavel_id: users[6].id, tipo_operacao_local: 'Comercial', classificacao_impacto_ambiental: 'Médio', praticas_sustentaveis: ['Reuso de Água'] },
      { id: uuid(), nome: 'CD Betim', endereco: 'Rod. Fernão Dias, km 492, Betim - MG', centro_custo_id: ccs[2].id, responsavel_id: users[2].id, tipo_operacao_local: 'Logístico', classificacao_impacto_ambiental: 'Alto', praticas_sustentaveis: ['Coleta Seletiva', 'Reuso de Água'] },
      { id: uuid(), nome: 'Fábrica Campinas', endereco: 'Distrito Industrial, Campinas - SP', centro_custo_id: ccs[4].id, responsavel_id: users[6].id, tipo_operacao_local: 'Industrial', classificacao_impacto_ambiental: 'Alto', praticas_sustentaveis: ['Coleta Seletiva', 'Reuso de Água', 'Energia Renovável'] },
    ];
    await this.localRepo.save(locais);

    // Categorias
    const cats = [
      { id: uuid(), nome: 'Manutenção Predial', criticidade_padrao: 'media', sla_dias: 15, tipo_manutencao: 'Preventiva', impacto_ambiental_esperado: 'Baixo', potencial_geracao_residuos: 'Baixo' },
      { id: uuid(), nome: 'Climatização e HVAC', criticidade_padrao: 'alta', sla_dias: 7, tipo_manutencao: 'Preventiva', impacto_ambiental_esperado: 'Médio', potencial_geracao_residuos: 'Médio' },
      { id: uuid(), nome: 'Limpeza e Conservação', criticidade_padrao: 'baixa', sla_dias: 30, tipo_manutencao: 'Preventiva', impacto_ambiental_esperado: 'Baixo', potencial_geracao_residuos: 'Médio' },
      { id: uuid(), nome: 'Segurança Patrimonial', criticidade_padrao: 'critica', sla_dias: 3, tipo_manutencao: 'Emergencial', impacto_ambiental_esperado: 'Baixo', potencial_geracao_residuos: 'Baixo' },
      { id: uuid(), nome: 'Elétrica e Iluminação', criticidade_padrao: 'alta', sla_dias: 10, tipo_manutencao: 'Corretiva', impacto_ambiental_esperado: 'Alto', potencial_geracao_residuos: 'Alto' },
      { id: uuid(), nome: 'Paisagismo', criticidade_padrao: 'baixa', sla_dias: 45, tipo_manutencao: 'Preventiva', impacto_ambiental_esperado: 'Baixo', potencial_geracao_residuos: 'Baixo' },
      { id: uuid(), nome: 'Dedetização e Controle de Pragas', criticidade_padrao: 'media', sla_dias: 15, tipo_manutencao: 'Preventiva', impacto_ambiental_esperado: 'Alto', potencial_geracao_residuos: 'Médio' },
      { id: uuid(), nome: 'Reforma e Adequação', criticidade_padrao: 'media', sla_dias: 60, tipo_manutencao: 'Corretiva', impacto_ambiental_esperado: 'Alto', potencial_geracao_residuos: 'Alto' },
    ];
    await this.catRepo.save(cats);

    // Subcategorias
    const subcats = [
      { id: uuid(), nome: 'Preventiva', categoria_id: cats[0].id },
      { id: uuid(), nome: 'Corretiva', categoria_id: cats[0].id },
      { id: uuid(), nome: 'Preditiva', categoria_id: cats[0].id },
      { id: uuid(), nome: 'Split', categoria_id: cats[1].id },
      { id: uuid(), nome: 'Central', categoria_id: cats[1].id },
      { id: uuid(), nome: 'Ventilação', categoria_id: cats[1].id },
      { id: uuid(), nome: 'Diária', categoria_id: cats[2].id },
      { id: uuid(), nome: 'Pesada', categoria_id: cats[2].id },
      { id: uuid(), nome: 'Pós-obra', categoria_id: cats[2].id },
      { id: uuid(), nome: 'CFTV', categoria_id: cats[3].id },
      { id: uuid(), nome: 'Controle de Acesso', categoria_id: cats[3].id },
      { id: uuid(), nome: 'Vigilância', categoria_id: cats[3].id },
      { id: uuid(), nome: 'Quadros', categoria_id: cats[4].id },
      { id: uuid(), nome: 'Iluminação', categoria_id: cats[4].id },
      { id: uuid(), nome: 'Cabeamento', categoria_id: cats[4].id },
      { id: uuid(), nome: 'Poda', categoria_id: cats[5].id },
      { id: uuid(), nome: 'Jardinagem', categoria_id: cats[5].id },
      { id: uuid(), nome: 'Irrigação', categoria_id: cats[5].id },
      { id: uuid(), nome: 'Insetos', categoria_id: cats[6].id },
      { id: uuid(), nome: 'Roedores', categoria_id: cats[6].id },
      { id: uuid(), nome: 'Sanitização', categoria_id: cats[6].id },
      { id: uuid(), nome: 'Pintura', categoria_id: cats[7].id },
      { id: uuid(), nome: 'Piso', categoria_id: cats[7].id },
      { id: uuid(), nome: 'Alvenaria', categoria_id: cats[7].id },
    ];
    await this.subcatRepo.save(subcats);

    // Fornecedores
    const forns = [
      { id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '12.345.678/0001-90', razao_social: 'TechClima Engenharia Ltda', nome_fantasia: 'TechClima', email: 'contato@techclima.com.br', telefone: '(11) 3456-7890', rating: 4.5, usuario_id: users[7].id, categorias_atendidas: [cats[1].id], possui_politica_ambiental: true, possui_politica_sst: true, declara_uso_epi: true, equipe_treinada: true, classificacao_esg: 'Avançado' },
      { id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '23.456.789/0001-01', razao_social: 'ServiLimp Serviços de Limpeza S/A', nome_fantasia: 'ServiLimp', email: 'comercial@servilimp.com.br', telefone: '(11) 2345-6789', rating: 3.8, usuario_id: users[8].id, categorias_atendidas: [cats[2].id], possui_politica_ambiental: false, possui_politica_sst: true, declara_uso_epi: true, equipe_treinada: false, classificacao_esg: 'Básico' },
      { id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '34.567.890/0001-12', razao_social: 'Forte Segurança Empresarial Ltda', nome_fantasia: 'Forte Seg', email: 'propostas@forteseg.com.br', telefone: '(21) 3456-7890', rating: 4.2, usuario_id: users[9].id, categorias_atendidas: [cats[3].id], possui_politica_ambiental: true, possui_politica_sst: true, declara_uso_epi: true, equipe_treinada: true, classificacao_esg: 'Intermediário' },
      { id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '45.678.901/0001-23', razao_social: 'EletroForce Instalações Elétricas', nome_fantasia: 'EletroForce', email: 'orcamento@eletroforce.com.br', telefone: '(11) 4567-8901', rating: 4.0, categorias_atendidas: [cats[4].id], possui_politica_ambiental: true, possui_politica_sst: false, declara_uso_epi: true, equipe_treinada: true, classificacao_esg: 'Intermediário' },
      { id: uuid(), tipo_pessoa: 'PJ', cpf_cnpj: '56.789.012/0001-34', razao_social: 'Predial Master Engenharia', nome_fantasia: 'Predial Master', email: 'contato@predialmaster.com.br', telefone: '(11) 5678-9012', rating: 4.7, categorias_atendidas: [cats[0].id, cats[7].id], possui_politica_ambiental: true, possui_politica_sst: true, declara_uso_epi: true, equipe_treinada: true, classificacao_esg: 'Avançado' },
    ];
    await this.fornRepo.save(forns);

    // Certidões
    const certs = [
      { id: uuid(), fornecedor_id: forns[0].id, tipo: 'CND Federal', numero: 'CND-2026-001', data_emissao: '2026-01-10', data_validade: '2026-07-10', status: 'vigente' },
      { id: uuid(), fornecedor_id: forns[0].id, tipo: 'CND Estadual', numero: 'CND-2026-002', data_emissao: '2026-01-15', data_validade: '2026-07-15', status: 'vigente' },
      { id: uuid(), fornecedor_id: forns[1].id, tipo: 'CND Federal', numero: 'CND-2025-100', data_emissao: '2025-06-01', data_validade: '2025-12-01', status: 'vencida' },
      { id: uuid(), fornecedor_id: forns[2].id, tipo: 'CND Federal', numero: 'CND-2026-050', data_emissao: '2026-01-20', data_validade: '2026-07-20', status: 'vigente' },
      { id: uuid(), fornecedor_id: forns[2].id, tipo: 'FGTS', numero: 'CRF-2026-003', data_emissao: '2026-01-05', data_validade: '2026-02-05', status: 'vigente' },
      { id: uuid(), fornecedor_id: forns[3].id, tipo: 'CND Municipal', numero: 'CND-2026-080', data_emissao: '2025-12-15', data_validade: '2026-06-15', status: 'vigente' },
      { id: uuid(), fornecedor_id: forns[4].id, tipo: 'CND Federal', numero: 'CND-2026-200', data_emissao: '2026-02-01', data_validade: '2026-08-01', status: 'vigente' },
      { id: uuid(), fornecedor_id: forns[4].id, tipo: 'CND Trabalhista', numero: 'CNDT-2026-010', data_emissao: '2026-01-25', data_validade: '2026-07-25', status: 'vigente' },
    ];
    await this.certRepo.save(certs);

    // Demandas
    const demandas = [
      { id: uuid(), numero: 1, titulo: 'Manutenção preventiva ar-condicionado Torre Norte', descricao: 'Revisão semestral de todos os 48 splits e 6 centrais de ar', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[1].id, criticidade: 'alta', status: 'em_cotacao', solicitante_id: users[1].id, gestor_id: users[2].id, data_desejada: '2026-03-15', impacto_ambiental_demanda: 'Médio' },
      { id: uuid(), numero: 2, titulo: 'Contratação de serviço de limpeza - Escritório RJ', descricao: 'Limpeza diária do escritório RJ - 2 pavimentos, 800m²', local_id: locais[2].id, centro_custo_id: ccs[1].id, categoria_id: cats[2].id, criticidade: 'media', status: 'propostas_recebidas', solicitante_id: users[5].id, gestor_id: users[6].id, impacto_ambiental_demanda: 'Baixo' },
      { id: uuid(), numero: 3, titulo: 'Instalação de câmeras de segurança - CD Betim', descricao: 'Instalação de 32 câmeras IP + NVR + cabeamento', local_id: locais[3].id, centro_custo_id: ccs[2].id, categoria_id: cats[3].id, criticidade: 'critica', status: 'em_aprovacao', solicitante_id: users[1].id, gestor_id: users[2].id, impacto_ambiental_demanda: 'Baixo', justificativa_manutencao_emergencial: 'Falha no sistema de segurança existente, risco patrimonial' },
      { id: uuid(), numero: 4, titulo: 'Troca de iluminação para LED - Torre Sul', descricao: 'Substituição de 500 lâmpadas fluorescentes por LED', local_id: locais[1].id, centro_custo_id: ccs[0].id, categoria_id: cats[4].id, criticidade: 'media', status: 'aprovada', solicitante_id: users[5].id, gestor_id: users[2].id, impacto_ambiental_demanda: 'Alto' },
      { id: uuid(), numero: 5, titulo: 'Reforma do refeitório - Fábrica Campinas', descricao: 'Reforma completa: piso, pintura, bancadas, instalações', local_id: locais[4].id, centro_custo_id: ccs[4].id, categoria_id: cats[7].id, criticidade: 'media', status: 'em_execucao', solicitante_id: users[1].id, gestor_id: users[6].id, impacto_ambiental_demanda: 'Alto' },
      { id: uuid(), numero: 6, titulo: 'Dedetização trimestral - Todas as unidades', descricao: 'Controle de pragas urbanas em todas as 5 unidades', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[6].id, criticidade: 'baixa', status: 'aberta', solicitante_id: users[5].id, impacto_ambiental_demanda: 'Alto' },
      { id: uuid(), numero: 7, titulo: 'Reparo no telhado - CD Betim', descricao: 'Vazamento em 3 pontos do galpão principal', local_id: locais[3].id, centro_custo_id: ccs[2].id, categoria_id: cats[0].id, criticidade: 'alta', status: 'em_escopo', solicitante_id: users[1].id, gestor_id: users[2].id, impacto_ambiental_demanda: 'Baixo' },
      { id: uuid(), numero: 8, titulo: 'Manutenção do paisagismo - Sede SP', descricao: 'Poda, jardinagem e manutenção das áreas verdes', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[5].id, criticidade: 'baixa', status: 'rascunho', solicitante_id: users[5].id, impacto_ambiental_demanda: 'Baixo' },
      { id: uuid(), numero: 9, titulo: 'Instalação de gerador de emergência - Torre Norte', descricao: 'Gerador diesel 500kVA com QTA', local_id: locais[0].id, centro_custo_id: ccs[0].id, categoria_id: cats[4].id, criticidade: 'critica', status: 'concluida', solicitante_id: users[1].id, gestor_id: users[2].id, impacto_ambiental_demanda: 'Alto' },
      { id: uuid(), numero: 10, titulo: 'Adequação NR-10 - Fábrica Campinas', descricao: 'Adequação de quadros e instalações elétricas à NR-10', local_id: locais[4].id, centro_custo_id: ccs[4].id, categoria_id: cats[4].id, criticidade: 'alta', status: 'cancelada', solicitante_id: users[5].id, gestor_id: users[6].id, impacto_ambiental_demanda: 'Médio' },
    ];
    await this.demandaRepo.save(demandas);

    // Itens de Linha
    const itens = [
      { id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão splits 9000 BTUs (24 un)', tipo: 'mao_de_obra', quantidade: 24, unidade: 'un', ordem: 1 },
      { id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão splits 12000 BTUs (18 un)', tipo: 'mao_de_obra', quantidade: 18, unidade: 'un', ordem: 2 },
      { id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão splits 18000 BTUs (6 un)', tipo: 'mao_de_obra', quantidade: 6, unidade: 'un', ordem: 3 },
      { id: uuid(), demanda_id: demandas[0].id, descricao: 'Revisão centrais de ar (6 un)', tipo: 'mao_de_obra', quantidade: 6, unidade: 'un', ordem: 4 },
      { id: uuid(), demanda_id: demandas[0].id, descricao: 'Filtros de reposição', tipo: 'material', quantidade: 54, unidade: 'un', ordem: 5 },
      { id: uuid(), demanda_id: demandas[2].id, descricao: 'Câmera IP 4MP Hikvision', tipo: 'material', quantidade: 32, unidade: 'un', ordem: 1 },
      { id: uuid(), demanda_id: demandas[2].id, descricao: 'NVR 32 canais', tipo: 'equipamento', quantidade: 1, unidade: 'un', ordem: 2 },
      { id: uuid(), demanda_id: demandas[2].id, descricao: 'Cabo UTP Cat6 (caixa 305m)', tipo: 'material', quantidade: 4, unidade: 'cx', ordem: 3 },
      { id: uuid(), demanda_id: demandas[2].id, descricao: 'Instalação e configuração', tipo: 'mao_de_obra', quantidade: 1, unidade: 'vb', ordem: 4 },
      { id: uuid(), demanda_id: demandas[4].id, descricao: 'Demolição e remoção', tipo: 'mao_de_obra', quantidade: 1, unidade: 'vb', ordem: 1 },
      { id: uuid(), demanda_id: demandas[4].id, descricao: 'Piso porcelanato 60x60', tipo: 'material', quantidade: 120, unidade: 'm²', ordem: 2 },
      { id: uuid(), demanda_id: demandas[4].id, descricao: 'Pintura epóxi paredes', tipo: 'mao_de_obra', quantidade: 280, unidade: 'm²', ordem: 3 },
    ];
    await this.itemRepo.save(itens);

    // Propostas
    const propostas = [
      // Demanda 1 - Ar condicionado
      { id: uuid(), demanda_id: demandas[0].id, fornecedor_id: forns[0].id, valor_bruto: 48500, valor_liquido: 42350, impostos: { iss: 2425, inss: 2425, pcc: 1300 }, condicao_pagamento: '30/60 dias', prazo_execucao_dias: 15, status: 'recebida', match_escopo_pct: 95 },
      { id: uuid(), demanda_id: demandas[0].id, fornecedor_id: forns[3].id, valor_bruto: 52000, valor_liquido: 45500, impostos: { iss: 2600, inss: 2600, pcc: 1300 }, condicao_pagamento: '30 dias', prazo_execucao_dias: 10, status: 'recebida', match_escopo_pct: 88 },
      // Demanda 2 - Limpeza
      { id: uuid(), demanda_id: demandas[1].id, fornecedor_id: forns[1].id, valor_bruto: 18500, valor_liquido: 16200, impostos: { iss: 925, inss: 925, pcc: 450 }, condicao_pagamento: 'Mensal', prazo_execucao_dias: 365, status: 'analisada', match_escopo_pct: 100 },
      { id: uuid(), demanda_id: demandas[1].id, fornecedor_id: forns[4].id, valor_bruto: 21000, valor_liquido: 18400, impostos: { iss: 1050, inss: 1050, pcc: 500 }, condicao_pagamento: 'Mensal', prazo_execucao_dias: 365, status: 'recebida', match_escopo_pct: 92 },
      // Demanda 3 - Câmeras
      { id: uuid(), demanda_id: demandas[2].id, fornecedor_id: forns[2].id, valor_bruto: 145000, valor_liquido: 126800, impostos: { iss: 7250, inss: 7250, pcc: 3700 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 30, status: 'selecionada', selecionada: true, match_escopo_pct: 97 },
      { id: uuid(), demanda_id: demandas[2].id, fornecedor_id: forns[3].id, valor_bruto: 158000, valor_liquido: 138200, impostos: { iss: 7900, inss: 7900, pcc: 4000 }, condicao_pagamento: '50% + 50%', prazo_execucao_dias: 25, status: 'rejeitada', match_escopo_pct: 85 },
      { id: uuid(), demanda_id: demandas[2].id, fornecedor_id: forns[4].id, valor_bruto: 139000, valor_liquido: 121600, impostos: { iss: 6950, inss: 6950, pcc: 3500 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 35, status: 'rejeitada', match_escopo_pct: 90 },
      // Demanda 4 - LED
      { id: uuid(), demanda_id: demandas[3].id, fornecedor_id: forns[3].id, valor_bruto: 75000, valor_liquido: 65600, impostos: { iss: 3750, inss: 3750, pcc: 1900 }, condicao_pagamento: '30/60 dias', prazo_execucao_dias: 20, status: 'selecionada', selecionada: true, match_escopo_pct: 98 },
      { id: uuid(), demanda_id: demandas[3].id, fornecedor_id: forns[0].id, valor_bruto: 82000, valor_liquido: 71800, impostos: { iss: 4100, inss: 4100, pcc: 2000 }, condicao_pagamento: '30 dias', prazo_execucao_dias: 25, status: 'rejeitada', match_escopo_pct: 93 },
      // Demanda 5 - Reforma refeitório
      { id: uuid(), demanda_id: demandas[4].id, fornecedor_id: forns[4].id, valor_bruto: 280000, valor_liquido: 245000, impostos: { iss: 14000, inss: 14000, pcc: 7000 }, condicao_pagamento: 'Medição mensal', prazo_execucao_dias: 90, status: 'selecionada', selecionada: true, match_escopo_pct: 100 },
      { id: uuid(), demanda_id: demandas[4].id, fornecedor_id: forns[3].id, valor_bruto: 310000, valor_liquido: 271200, impostos: { iss: 15500, inss: 15500, pcc: 7800 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 75, status: 'rejeitada', match_escopo_pct: 88 },
      // Demanda 9 - Gerador
      { id: uuid(), demanda_id: demandas[8].id, fornecedor_id: forns[3].id, valor_bruto: 320000, valor_liquido: 280000, impostos: { iss: 16000, inss: 16000, pcc: 8000 }, condicao_pagamento: '50% + 50%', prazo_execucao_dias: 45, status: 'selecionada', selecionada: true, match_escopo_pct: 96 },
      { id: uuid(), demanda_id: demandas[8].id, fornecedor_id: forns[4].id, valor_bruto: 295000, valor_liquido: 258100, impostos: { iss: 14750, inss: 14750, pcc: 7400 }, condicao_pagamento: '30/60/90 dias', prazo_execucao_dias: 60, status: 'rejeitada', match_escopo_pct: 91 },
      { id: uuid(), demanda_id: demandas[8].id, fornecedor_id: forns[0].id, valor_bruto: 345000, valor_liquido: 301800, impostos: { iss: 17250, inss: 17250, pcc: 8700 }, condicao_pagamento: '30 dias', prazo_execucao_dias: 40, status: 'rejeitada', match_escopo_pct: 82 },
    ];
    await this.propRepo.save(propostas);

    // Workflow
    const workflows = [
      { id: uuid(), demanda_id: demandas[2].id, proposta_id: propostas[4].id, valor_total: 145000, status: 'em_andamento', etapa_atual: 2, etapas: [
        { ordem: 1, perfil: 'gestor_facilities', status: 'aprovado', data_acao: '2026-02-05T10:00:00Z', observacao: 'Projeto necessário para segurança', ressalva: false },
        { ordem: 2, perfil: 'aprovador_financeiro', status: 'pendente', data_acao: null, observacao: null, ressalva: false },
        { ordem: 3, perfil: 'diretoria', status: 'pendente', data_acao: null, observacao: null, ressalva: false },
      ]},
      { id: uuid(), demanda_id: demandas[3].id, proposta_id: propostas[7].id, valor_total: 75000, status: 'aprovado', etapa_atual: 3, etapas: [
        { ordem: 1, perfil: 'gestor_facilities', status: 'aprovado', data_acao: '2026-01-20T09:00:00Z', observacao: 'OK', ressalva: false },
        { ordem: 2, perfil: 'aprovador_financeiro', status: 'aprovado', data_acao: '2026-01-21T14:00:00Z', observacao: 'Dentro do orçamento', ressalva: false },
        { ordem: 3, perfil: 'diretoria', status: 'aprovado', data_acao: '2026-01-22T11:00:00Z', observacao: 'Aprovado', ressalva: false },
      ]},
      { id: uuid(), demanda_id: demandas[4].id, proposta_id: propostas[9].id, valor_total: 280000, status: 'aprovado', etapa_atual: 3, etapas: [
        { ordem: 1, perfil: 'gestor_facilities', status: 'aprovado', data_acao: '2026-01-10T10:00:00Z', observacao: 'Urgente', ressalva: false },
        { ordem: 2, perfil: 'aprovador_financeiro', status: 'aprovado_com_ressalva', data_acao: '2026-01-11T16:00:00Z', observacao: 'Verificar possibilidade de parcelamento maior', ressalva: true },
        { ordem: 3, perfil: 'diretoria', status: 'aprovado', data_acao: '2026-01-12T09:00:00Z', observacao: 'Aprovado', ressalva: false },
      ]},
    ];
    await this.wfRepo.save(workflows);

    // Ordens de Serviço
    const oss = [
      { id: uuid(), numero: 1, demanda_id: demandas[3].id, proposta_id: propostas[7].id, fornecedor_id: forns[3].id, valor: 75000, status: 'emitida', data_inicio: null },
      { id: uuid(), numero: 2, demanda_id: demandas[4].id, proposta_id: propostas[9].id, fornecedor_id: forns[4].id, valor: 280000, status: 'em_execucao', data_inicio: '2026-01-20' },
      { id: uuid(), numero: 3, demanda_id: demandas[8].id, proposta_id: propostas[11].id, fornecedor_id: forns[3].id, valor: 320000, status: 'concluida', data_inicio: '2025-11-01', data_conclusao: '2025-12-15' },
    ];
    await this.osRepo.save(oss);

    // Orçamento Planejado 2026
    const orcData = [];
    for (let mes = 1; mes <= 12; mes++) {
      for (const cc of ccs) {
        for (const cat of cats.slice(0, 5)) {
          orcData.push({
            id: uuid(),
            ano: 2026,
            mes,
            centro_custo_id: cc.id,
            categoria_id: cat.id,
            valor_planejado: Math.round((15000 + Math.random() * 85000) * 100) / 100,
            valor_comprometido: mes <= 2 ? Math.round(Math.random() * 30000 * 100) / 100 : 0,
            valor_realizado: mes <= 1 ? Math.round(Math.random() * 20000 * 100) / 100 : 0,
          });
        }
      }
    }
    // Save in batches
    for (let i = 0; i < orcData.length; i += 50) {
      await this.orcRepo.save(orcData.slice(i, i + 50));
    }

    // Alertas
    const alertas = [
      { id: uuid(), usuario_id: users[3].id, tipo: 'aprovacao_pendente', titulo: 'Aprovação pendente: Câmeras CD Betim', mensagem: 'A demanda #3 aguarda sua aprovação financeira. Valor: R$ 145.000,00', entidade: 'workflow', entidade_id: workflows[0].id },
      { id: uuid(), usuario_id: users[2].id, tipo: 'sla_vencendo', titulo: 'SLA próximo: Dedetização', mensagem: 'A demanda #6 está há 10 dias sem andamento', entidade: 'demanda', entidade_id: demandas[5].id },
      { id: uuid(), usuario_id: users[0].id, tipo: 'certidao_vencendo', titulo: 'Certidão vencida: ServiLimp', mensagem: 'A CND Federal da ServiLimp está vencida desde 01/12/2025', entidade: 'fornecedor', entidade_id: forns[1].id },
      { id: uuid(), usuario_id: users[2].id, tipo: 'estouro_orcamento', titulo: 'Alerta de orçamento: CC Sede SP', mensagem: 'O centro de custo CC-001 está com comprometimento acima de 80% para Climatização em Janeiro', entidade: 'orcamento' },
      { id: uuid(), usuario_id: users[6].id, tipo: 'os_atrasada', titulo: 'OS em atraso: Reforma Refeitório', mensagem: 'A OS #2 está em execução há mais de 30 dias', entidade: 'ordem_servico', entidade_id: oss[1].id },
    ];
    await this.alertaRepo.save(alertas);

    // ESG Métricas
    const esgMetricas = [];
    const tiposEsg = ['energia', 'agua', 'residuos', 'emissoes'];
    const unidades = { energia: 'kWh', agua: 'm³', residuos: 'kg', emissoes: 'tCO2e' };
    for (let mes = 1; mes <= 12; mes++) {
      for (const tipo of tiposEsg) {
        esgMetricas.push({
          id: uuid(), tipo, unidade_medida: unidades[tipo],
          valor: Math.round((tipo === 'energia' ? 15000 + Math.random() * 10000 : tipo === 'agua' ? 500 + Math.random() * 300 : tipo === 'residuos' ? 2000 + Math.random() * 1500 : 50 + Math.random() * 30) * 100) / 100,
          periodo_mes: mes, periodo_ano: 2026, local_id: locais[0].id, centro_custo_id: ccs[0].id,
          fonte_dados: 'Medidor automático', observacoes: null,
        });
      }
    }
    await this.esgMetricaRepo.save(esgMetricas);

    // ESG Metas
    const esgMetas = [
      { id: uuid(), tipo: 'energia', meta_valor: 200000, periodo_ano: 2026, local_id: locais[0].id },
      { id: uuid(), tipo: 'agua', meta_valor: 8000, periodo_ano: 2026, local_id: locais[0].id },
      { id: uuid(), tipo: 'residuos', meta_valor: 30000, periodo_ano: 2026, local_id: locais[0].id },
      { id: uuid(), tipo: 'emissoes', meta_valor: 600, periodo_ano: 2026, local_id: locais[0].id },
      { id: uuid(), tipo: 'energia', meta_valor: 100000, periodo_ano: 2026, local_id: locais[2].id },
    ];
    await this.esgMetaRepo.save(esgMetas);

    // KPIs
    const kpis = [
      { id: uuid(), nome: 'Custo por m²', descricao: 'Custo de facilities por metro quadrado', formula: 'custo_total / area_total', categoria: 'financeiro', unidade: 'R$/m²', meta_valor: 45, valor_atual: 38.5, periodo_mes: 1, periodo_ano: 2026, status: 'verde' },
      { id: uuid(), nome: 'SLA de Atendimento', descricao: '% de demandas atendidas dentro do SLA', formula: 'demandas_no_prazo / total_demandas * 100', categoria: 'prazo', unidade: '%', meta_valor: 90, valor_atual: 82, periodo_mes: 1, periodo_ano: 2026, status: 'amarelo' },
      { id: uuid(), nome: 'Índice de Retrabalho', descricao: '% de OS com retrabalho', formula: 'os_retrabalho / total_os * 100', categoria: 'qualidade', unidade: '%', meta_valor: 5, valor_atual: 3.2, periodo_mes: 1, periodo_ano: 2026, status: 'verde' },
      { id: uuid(), nome: 'Ocupação de Espaços', descricao: '% de ocupação dos espaços', formula: 'area_ocupada / area_total * 100', categoria: 'operacional', unidade: '%', meta_valor: 85, valor_atual: 78, periodo_mes: 1, periodo_ano: 2026, status: 'amarelo' },
      { id: uuid(), nome: 'Economia Energética', descricao: '% de redução no consumo de energia', formula: '(consumo_anterior - consumo_atual) / consumo_anterior * 100', categoria: 'financeiro', unidade: '%', meta_valor: 10, valor_atual: 7.5, periodo_mes: 1, periodo_ano: 2026, status: 'amarelo' },
      { id: uuid(), nome: 'Satisfação do Cliente Interno', descricao: 'Nota média das avaliações', formula: 'soma_notas / total_avaliacoes', categoria: 'qualidade', unidade: 'nota', meta_valor: 4.5, valor_atual: 4.2, periodo_mes: 1, periodo_ano: 2026, status: 'verde' },
      { id: uuid(), nome: 'Taxa de Manutenção Preventiva', descricao: '% preventiva vs corretiva', formula: 'manutencao_preventiva / total_manutencao * 100', categoria: 'operacional', unidade: '%', meta_valor: 70, valor_atual: 55, periodo_mes: 1, periodo_ano: 2026, status: 'vermelho' },
      { id: uuid(), nome: 'Tempo Médio de Resposta', descricao: 'Tempo médio para primeira resposta a demanda', formula: 'soma_tempos_resposta / total_demandas', categoria: 'prazo', unidade: 'horas', meta_valor: 4, valor_atual: 3.1, periodo_mes: 1, periodo_ano: 2026, status: 'verde' },
    ];
    await this.kpiRepo.save(kpis);

    // Metas
    const metas = [
      { id: uuid(), titulo: 'Reduzir custo operacional em 15%', descricao: 'Redução geral de custos operacionais de facilities', tipo: 'orcamento', centro_custo_id: ccs[0].id, valor_meta: 15, valor_atual: 8.3, unidade: '%', prazo: '2026-12-31', status: 'em_andamento' },
      { id: uuid(), titulo: 'Implementar programa de reciclagem', descricao: 'Implantar coleta seletiva em todas as unidades', tipo: 'esg', valor_meta: 5, valor_atual: 3, unidade: 'unidades', prazo: '2026-06-30', status: 'em_andamento' },
      { id: uuid(), titulo: 'SLA 95% até junho', descricao: 'Atingir 95% de atendimento dentro do SLA', tipo: 'operacional', valor_meta: 95, valor_atual: 82, unidade: '%', prazo: '2026-06-30', status: 'em_andamento' },
      { id: uuid(), titulo: 'Reduzir consumo de energia 10%', descricao: 'Meta anual de redução energética', tipo: 'esg', centro_custo_id: ccs[0].id, valor_meta: 10, valor_atual: 7.5, unidade: '%', prazo: '2026-12-31', status: 'em_andamento' },
      { id: uuid(), titulo: 'Digitalizar 100% dos contratos', descricao: 'Todos os contratos de fornecedores digitalizados', tipo: 'operacional', valor_meta: 100, valor_atual: 100, unidade: '%', prazo: '2026-03-31', status: 'atingida' },
      { id: uuid(), titulo: 'Certificação ISO 14001', descricao: 'Obter certificação ambiental ISO 14001', tipo: 'esg', valor_meta: 1, valor_atual: 0, unidade: 'certificação', prazo: '2026-09-30', status: 'em_andamento' },
      { id: uuid(), titulo: 'Orçamento anual: desvio < 5%', descricao: 'Manter desvio orçamentário abaixo de 5%', tipo: 'orcamento', valor_meta: 5, valor_atual: 3.2, unidade: '%', prazo: '2026-12-31', status: 'em_andamento' },
      { id: uuid(), titulo: 'Rating fornecedores > 4.0', descricao: 'Manter rating médio de fornecedores acima de 4.0', tipo: 'operacional', valor_meta: 4.0, valor_atual: 4.2, unidade: 'nota', prazo: '2026-12-31', status: 'atingida' },
      { id: uuid(), titulo: 'Reduzir consumo de água 8%', descricao: 'Meta anual de economia hídrica', tipo: 'esg', centro_custo_id: ccs[0].id, valor_meta: 8, valor_atual: 2.1, unidade: '%', prazo: '2026-12-31', status: 'atrasada' },
      { id: uuid(), titulo: 'Zerar OS atrasadas', descricao: 'Nenhuma OS com atraso superior a 7 dias', tipo: 'operacional', valor_meta: 0, valor_atual: 2, unidade: 'OS', prazo: '2026-06-30', status: 'atrasada' },
    ];
    await this.metaRepo.save(metas);

    // Alerta Configs
    const alertaConfigs = [
      { id: uuid(), tipo: 'orcamento_excedido', centro_custo_id: ccs[0].id, limite_percentual: 80, ativo: true },
      { id: uuid(), tipo: 'orcamento_excedido', centro_custo_id: ccs[1].id, limite_percentual: 85, ativo: true },
      { id: uuid(), tipo: 'certidao_vencendo', limite_percentual: 30, ativo: true },
      { id: uuid(), tipo: 'os_atrasada', limite_percentual: 7, ativo: true },
      { id: uuid(), tipo: 'meta_risco', limite_percentual: 50, ativo: true },
      { id: uuid(), tipo: 'orcamento_excedido', centro_custo_id: ccs[4].id, limite_percentual: 90, ativo: false },
    ];
    await this.alertaConfigRepo.save(alertaConfigs);

    console.log('✅ Seed completed!');
  }
}
