// migration-categories.js

const mongoose = require('mongoose');

const shared_consts = require('../tools/shared_nodejs');
const tools = require('../tools/general');

const { Sector } = require('../models/sector');
const { SectorGood } = require('../models/sectorgood');
const { SectorBacheca } = require('../models/sectorbacheca');
const { Skill } = require('../models/skill');
const { Good } = require('../models/good');
const { Bacheca } = require('../models/bacheca');
const { Version } = require('../models/version');

const { MySkill } = require('../models/myskill');
const { MyGood } = require('../models/mygood');
const { MyBacheca } = require('../models/mybacheca');

// ============================================================================
// MAPPING DEFINITIONS
// ============================================================================

// Mapping vecchi ID Skills -> nuovi ID Skills
const skillSectorMapping = {
  1: 1, // Abitare -> Abitare e Costruire
  2: 2, // Agricoltura -> Agricoltura e Orticoltura
  3: 3, // Alimentazione -> Alimentazione e Trasformazione
  4: 4, // Animali -> Animali e Allevamento
  5: 10, // Auto e Veicoli -> Mobilità e Trasporti
  6: 6, // Benessere -> Benessere e Cura Naturale
  7: 9, // Per la Casa -> Manutenzione e Riparazione
  8: 15, // Intrattenimento -> Tempo Libero e Cultura
  10: 7, // Per la Persona -> Educazione e Formazione (parte)
  11: 11, // Progetti di Gruppo -> Progetti Comunitari
  12: 12, // Salute -> Salute e Terapie
  13: 13, // Tecnologie -> Tecnologie Appropriate
  14: 5, // Servizi -> Artigianato e Creazione
};

// Mapping vecchi ID SubSkills -> nuovi ID SubSkills
const subSkillMapping = {
  1: 1, // Autocostruzione
  2: 4, // Ecovillaggi / Comunità
  3: 3, // Cohousing
  4: 13, // Orto sinergico
  5: 15, // Pacciamatura
  6: 14, // Orto tradizionale
  7: 16, // Permacultura
  8: 12, // Cultura idroponica
  9: 11, // Elettrocultura
  10: 10, // Aratura + semina
  11: 17, // Potatura
  12: 18, // Raccolta
  13: 20, // Preparazione cibi
  14: 21, // Preparazione bevande
  15: 20, // Autoproduzione alimenti e bevande
  16: 32, // Servizi per Cani
  17: 32, // Servizi per Gatti
  18: 30, // Servizi per Animali da allevamento
  19: 33, // Veterinario
  20: 114, // Riparazioni Auto
  21: 115, // Riparazioni Moto
  22: 111, // Riparazioni Camper / Van
  23: 111, // Creazione di Van Camperizzati
  24: 112, // Noleggio veicoli
  25: 113, // Lavaggio auto
  26: 50, // Alimentazione Naturale
  27: 57, // Ginnastica
  28: 68, // Yoga
  29: 66, // Trattamenti Olistici
  30: 60, // Meditazione e mindfulness
  31: 65, // Trattamenti Energetici
  32: 67, // Trattamenti Sonori
  33: 51, // Arteterapia
  34: 63, // Teatroterapia
  35: 52, // Cantoterapia
  36: 65, // Trattamenti Luminosi
  37: 55, // Fitoterapia
  38: 58, // Kinesiologia
  39: 66, // Terapie Naturali
  40: 96, // Muratore
  41: 95, // Imbianchino
  42: 91, // Elettricista - TV
  43: 41, // Falegname
  44: 92, // Fabbro
  45: 90, // Arredamento
  46: 94, // Idraulico
  47: 93, // Giardiniere
  48: 86, // Canne fumarie e camini e stufe
  49: 82, // Pannelli solari
  50: 101, // Riparazioni varie
  51: 101, // Tuttofare
  52: 100, // Traslochi
  53: 97, // Piastrellista
  54: 98, // Pulizie
  55: 171, // Ballo
  56: 172, // Canto
  57: 176, // Musica
  58: 175, // Letteratura e poesia
  59: 178, // Teatro
  60: 174, // Fotografia
  61: 173, // Film making
  62: 177, // Sport
  63: 170, // Arte
  70: 163, // Parrucchiere -> Sartoria su Misura
  71: 66, // Estetista -> Trattamenti Olistici
  72: 136, // Omeopatia
  73: 137, // Assistenza anziani -> OSS
  76: 125, // Baby sitter -> Volontariato
  77: 163, // Sarto
  78: 160, // Autoproduzione prodotti persona
  79: 70, // Corsi e Formazione
  80: 125, // Supporto spesa
  81: 125, // Volontariato
  82: 123, // Gruppi di acquisto
  83: 120, // Banca del tempo
  84: 121, // Collabora con noi
  85: 122, // Eventi
  86: 124, // Laboratori
  87: 121, // Idee e suggerimenti
  88: 133, // Medico di base
  89: 142, // Specialista
  90: 139, // Pediatra
  91: 131, // Dentista
  92: 140, // Psicologo
  93: 141, // Psicoterapeuta
  94: 138, // Ostetrica
  95: 135, // Nutrizionista
  97: 130, // Counseling
  98: 151, // Assistenza PC / software
  99: 150, // Assistenza Cellulari
  100: 154, // Realizzazione Siti web
  101: 153, // Realizzazione App / Piattaforme
  102: 152, // Corsi d'Informatica
  103: 99, // Riparazione Elettrodomestici
  104: 132, // Infermiera
  105: 137, // OSS
  106: 125, // Badante
  107: 59, // Massaggi
  109: 130, // Supporto
  110: 130, // Consulenza
  111: 56, // Floriterapia
  112: 54, // Costellazioni Familiari
  113: 53, // Coach Motivazionale
  114: 64, // Tecniche Essene
  115: 62, // Riflessologia
  116: 61, // Naturopatia
  120: 170, // Grafica
  121: 154, // Web
  122: 2, // Progettazione -> Bioedilizia
  123: 134, // Medicina Naturale
  124: 5, // Casa in Vendita
  125: 6, // Casa in Affitto
  126: 8, // Terreno
  127: 7, // Stanza in affitto
  128: 7, // Stanza in condivisione
  129: 23, // Home Restaurant
  130: 82, // Pannelli Solari
  131: 84, // Pompe di calore
  132: 82, // Impianti Fotovoltaici
  133: 43, // Restauro
  134: 101, // Altro
  135: 82, // Pannelli Solari
  136: 152, // Corso di Podcasting : Corsi d'Informatica
  137: 69, // Biodanza
  74: 75, // Contabile/commercialista -> Consulenze Professionali
  75: 75, // Avvocato -> Consulenze Professionali
  108: 126, // Affrancamento -> Servizi alla Comunità
  117: 75, // Organizzazione Aziendale -> Consulenze Professionali
  118: 75, // Project Manager -> Consulenze Professionali
  119: 75, // Consulenze per Startup -> Consulenze Professionali
};

// Mapping vecchi ID SectorGoods -> nuovi ID SectorGoods
const sectorGoodMapping = {
  1: 1, // Abbigliamento -> Abbigliamento e Accessori
  2: 2, // Arredamento -> Arredamento e Casa
  3: 3, // Auto e Moto -> Auto, Moto e Veicoli
  4: 4, // Artigianato -> Artigianato e Creazioni
  5: 5, // Bellezza e Igiene -> Bellezza e Cura Persona
  6: 6, // Bimbi -> Infanzia e Bambini
  7: 7, // Cibo -> Cibi e Bevande
  8: 8, // Collezionismo e Antiquariato (invariato)
  9: 9, // Elettronica -> Elettronica e Tecnologia
  10: 10, // Giochi -> Gaming e Console
  11: 11, // Hobby e Fai da Te -> Giardinaggio e Fai da Te
  12: 12, // Libri -> Libri e Riviste
  13: 13, // Musica e Film (invariato)
  14: 14, // Scuola e Ufficio (invariato)
  15: 15, // Sport -> Sport e Fitness
  16: null, // Varie -> DISTRIBUITO (rimuovere, troppo generico)
  17: 17, // Attrezzature -> Attrezzature e Strumenti
  18: 16, // Animali
  19: 20, // Arte e Decorazioni
  20: 19, // Agricoltura -> Agricoltura e Orticoltura
  21: 18, // Elettrodomestici
};

// Mapping vecchi ID SectorBacheca -> nuovi ID SectorBacheca
const sectorBachecaMapping = {
  1: 1, // Abitare -> Abitare Alternativo
  2: 2, // Agricoltura -> Agricoltura e Permacultura
  3: 3, // Alimentazione -> Alimentazione Consapevole
  4: 4, // Animali -> Animali e Natura
  5: 11, // Auto e Veicoli -> Mobilità Sostenibile
  6: 5, // Benessere -> Benessere Olistico
  7: 10, // Per la Casa -> Lavoro e Autoproduzione
  8: 6, // Intrattenimento -> Cultura e Arte
  10: 8, // Per la Persona -> Educazione Alternativa
  11: 12, // Progetti di Gruppo -> Progetti Comunitari
  12: 13, // Salute -> Salute Naturale
  13: 14, // Tecnologie -> Tecnologie Appropriate
  14: 7, // Servizi -> Economia Solidale
};

// Mapping vecchi idSkill -> nuovi idBacheca
const bachecaMapping = {
  1: 1, // Autocostruzione
  2: 4, // Ecovillaggi / Comunità -> Ecovillaggi
  3: 3, // Cohousing
  4: 12, // Orto sinergico -> Permacultura
  7: 12, // Permacultura
  26: 40, // Alimentazione Naturale -> Cerchi di Condivisione
  27: 44, // Ginnastica -> Yoga e Movimento
  28: 44, // Yoga -> Yoga e Movimento
  29: 43, // Trattamenti Olistici -> Pratiche Energetiche
  30: 42, // Meditazione e mindfulness -> Meditazione
  55: 50, // Ballo
  56: 51, // Canto -> Cerchi di Canto
  57: 53, // Musica -> Concerti
  59: 55, // Teatro
  79: 73, // Corsi e Formazione -> Workshop e Corsi
  82: 24, // Gruppi di acquisto -> Gruppi Acquisto
  83: 60, // Banca del tempo -> Banca del Tempo
  84: 114, // Collabora con noi -> Nuove Iniziative
  85: 113, // Eventi -> Eventi Comunitari
  86: 71, // Laboratori -> Laboratori Bambini
  87: 111, // Idee e suggerimenti -> Brainstorming
  // Aggiungi altri mapping secondo necessità
  // Per gli altri usa categoria generica o 0
};

// ============================================================================
// MIGRATION FUNCTIONS
// ============================================================================

/**
 * Aggiorna i settori Skills con nuove categorie
 */
async function updateSkillSectors(Sector) {
  console.log('🔄 Aggiornamento Skill Sectors...');

  const newSectors = require('./new_sectors');

  await Sector.deleteMany({});
  const result = await Sector.insertMany(newSectors.list);

  console.log(`✅ ${result.length} Skill Sectors aggiornati`);
}

/**
 * Aggiorna le Skills con nuove sottocategorie
 */
async function updateSkills(Skill) {
  console.log('🔄 Aggiornamento Sub-Skills...');

  const newSkills = require('./new_subskills'); // Il file che hai creato sopra

  await Skill.deleteMany({});
  const result = await Skill.insertMany(newSkills.list);

  console.log(`✅ ${result.length} Sub-Skills aggiornate`);
}

async function updateSectorGoods(Good) {
  console.log('🔄 Aggiornamento SectorGoods...');

  const newSectorGoods = require('./new_sectorgoods');

  await SectorGood.deleteMany({});
  const result = await SectorGood.insertMany(newSectorGoods.list);

  console.log(`✅ ${result.length} SectorGood aggiornati`);
}
async function updateSectorBachecas(Bacheca) {
  console.log('🔄 Aggiornamento SectorBachecas...');

  const newSectorBachecas = require('./new_sectorbachecas');

  await SectorBacheca.deleteMany({});
  const result = await SectorBacheca.insertMany(newSectorBachecas.list);

  console.log(`✅ ${result.length} SectorBacheca aggiornati`);
}

/**
 * Aggiorna i Goods (rimozione campo color)
 */
async function updateGoods(Good) {
  console.log('🔄 Aggiornamento Goods...');

  const newGoods = require('./new_goods');

  await Good.deleteMany({});
  const result = await Good.insertMany(newGoods.list);

  console.log(`✅ ${result.length} Goods aggiornati`);
}
async function updateBachecas(Good) {
  console.log('🔄 Aggiornamento Bachecas...');

  const newBachecas = require('./new_bachecas');

  await Bacheca.deleteMany({});
  const result = await Bacheca.insertMany(newBachecas.list);

  console.log(`✅ ${result.length} Bachecas aggiornati`);
}

/**
 * Migra i record MySkill
 */
async function migrateMySkills(MySkill) {
  console.log('🔄 Migrazione MySkill records...');

  const records = await MySkill.find({}).lean();
  let updated = 0;
  let unchanged = 0;

  for (const record of records) {
    const updates = {};

    // Mappa idSector
    if (record.idSector && skillSectorMapping[record.idSector]) {
      if (skillSectorMapping[record.idSector] !== record.idSector) {
        updates.idSector = skillSectorMapping[record.idSector];
      }
    }

    // Mappa idSkill (tutte hanno destinazione ora)
    if (record.idSkill && subSkillMapping[record.idSkill] !== undefined) {
      const newId = subSkillMapping[record.idSkill];
      if (newId !== record.idSkill) {
        updates.idSkill = newId;
      }
    }

    if (Object.keys(updates).length > 0) {
      await MySkill.updateOne({ _id: record._id }, { $set: updates });
      updated++;
    } else {
      unchanged++;
    }
  }

  console.log(`✅ MySkill: ${updated} aggiornati, ${unchanged} invariati`);
}

/**
 * Migra i record MyGood
 */
async function migrateMyGoods(MyGood) {
  console.log('🔄 Migrazione MyGood records...');

  const records = await MyGood.find({}).lean();
  let updated = 0;
  let unchanged = 0;

  for (const record of records) {
    const updates = {};

    // Mappa idSectorGood
    if (record.idSectorGood && sectorGoodMapping[record.idSectorGood]) {
      if (sectorGoodMapping[record.idSectorGood] !== record.idSectorGood) {
        updates.idSectorGood = sectorGoodMapping[record.idSectorGood];
      }
    }

    // idGood rimane invariato (stessi ID)

    if (Object.keys(updates).length > 0) {
      await MyGood.updateOne({ _id: record._id }, { $set: updates });
      updated++;
    } else {
      unchanged++;
    }
  }

  console.log(`✅ MyGood: ${updated} aggiornati, ${unchanged} invariati`);
}

/**
 * Migra i record MyBacheca
 */
async function migrateMyBacheca(MyBacheca) {
  console.log('🔄 Migrazione MyBacheca records...');

  const records = await MyBacheca.find({}).lean();
  let updated = 0;
  let unchanged = 0;

  for (const record of records) {
    const updates = {};

    // Mappa idSector -> idSectorBacheca (vecchio campo -> nuovo campo)
    if (record.idSector && sectorBachecaMapping[record.idSector]) {
      updates.idSectorBacheca = sectorBachecaMapping[record.idSector];
    }

    // Mappa idSkill -> idBacheca (vecchio campo -> nuovo campo)
    if (record.idSkill && bachecaMapping[record.idSkill] !== undefined) {
      updates.idBacheca = bachecaMapping[record.idSkill];
    } else if (record.idSkill) {
      // Se non c'è mapping specifico, metti 0 (generico)
      updates.idBacheca = 0;
    }

    // Rimuovi i campi vecchi
    const unsetFields = {};
    if (record.idSector !== undefined) unsetFields.idSector = '';
    if (record.idSkill !== undefined) unsetFields.idSkill = '';

    if (Object.keys(updates).length > 0 || Object.keys(unsetFields).length > 0) {
      const updateQuery = {};

      if (Object.keys(updates).length > 0) {
        updateQuery.$set = updates;
      }

      if (Object.keys(unsetFields).length > 0) {
        updateQuery.$unset = unsetFields;
      }

      await MyBacheca.updateOne({ _id: record._id }, updateQuery);
      updated++;
    } else {
      unchanged++;
    }
  }

  console.log(`✅ MyBacheca: ${updated} aggiornati, ${unchanged} invariati`);
}

async function aggiornaCategorieESottoCategorie() {
  console.log('\n Migrazione DIC 2025 da ESEGUIRE ----------- ');
  await updateSkillSectors(Sector);
  await updateSkills(Skill);
  await updateSectorGoods(SectorGood);
  await updateSectorBachecas(SectorBacheca);
  await updateGoods(Good);
  await updateBachecas(Bacheca);

  // const populate = require('./populate');

  // ris = populate.rewriteTable('contribtypes');

  return ris;
}
// ============================================================================
// MAIN MIGRATION SCRIPT
// ============================================================================

async function runMigration() {
  try {
    const idapp = 0; // TUTTI

    console.log('🚀 Controllo Versioni Tabelle (runMigration)');

    const isMigratioDic2025Executed = await Version.isJobExecuted(
      idapp,
      shared_consts.JOB_TO_EXECUTE.MIGRATION_SECTORS_DIC25
    );

    const vers_server_str = await tools.getVersServer();

    const version_server = tools.versionToNumber(vers_server_str);

    // Step 1: Aggiorna categorie solo 1 volta sola !
    if (!isMigratioDic2025Executed) {
      await aggiornaCategorieESottoCategorie();
    }

    const myskill_updated = await Version.isTableVersionUpdated(idapp, 'myskill');
    if (!myskill_updated) {
      // MYSKILL

      if (!isMigratioDic2025Executed) await migrateMySkills(MySkill);

      // ++ Altri aggiornamenti da fare

      // FINE - Aggiorna Versione Tabella
      await Version.updateTableVersion(idapp, 'myskill', version_server);
    }

    const mygood_updated = await Version.isTableVersionUpdated(idapp, 'mygood');
    if (!mygood_updated) {
      // MYGOOD
      if (!isMigratioDic2025Executed) await migrateMyGoods(MyGood);

      // ++ Altri aggiornamenti da fare

      // FINE - Aggiorna Versione Tabella
      await Version.updateTableVersion(idapp, 'mygood', version_server);
    }

    const mybacheca_updated = await Version.isTableVersionUpdated(idapp, 'mybacheca');
    if (!mybacheca_updated) {
      // MYBACHECA

      if (!isMigratioDic2025Executed) await migrateMyBacheca(MyBacheca);

      // ++ Altri aggiornamenti da fare

      // FINE - Aggiorna Versione Tabella
      await Version.updateTableVersion(idapp, 'mybacheca', version_server);
    }

    // FINE -----------------------
    if (!isMigratioDic2025Executed) {
      await Version.setJobExecuted(idapp, shared_consts.JOB_TO_EXECUTE.MIGRATION_SECTORS_DIC25);
      console.log('\n✅ Migrazione DIC 2025 completata con successo!');
    }

    await Version.setLastVersionRun(idapp, version_server);
  } catch (error) {
    console.error('❌ Errore durante la migrazione:', error);
  } finally {
  }
}

module.exports = {
  runMigration,
  skillSectorMapping,
  subSkillMapping,
  sectorGoodMapping,
  sectorBachecaMapping,
  aggiornaCategorieESottoCategorie,  
};
