/**
 * ======================================================
 *  TELEGRAM BOT INIT  (derived from telegrambot_OLD.js)
 * ======================================================
 *  - Gestione multi-bot per app (arrTelegram)
 *  - Classe Telegram con funzioni core
 *  - Invio messaggi, immagini, notifiche
 *  - Callback Query, menu e inline keyboard
 *  - API pubbliche per admin, manager, utenti
 *  - Compatibile con tools, User, Circuit, ecc.
 * ======================================================
 */

const TelegramBot = require('node-telegram-bot-api');
const fs = require('fs');
const path = require('path');
const axios = require('axios');
const sharp = require('sharp');

const tools = require('../tools/general');
const shared_consts = require('../tools/shared_nodejs');
const server_constants = require('../tools/server_constants');
const { Site } = require('../models/site');

const { handleCallback } = require('./handlers/callbackHandler');


// -----------------------------------------------------------------------------
// 🔹 COSTANTI, ENUM, EMOJI E TEXT
// -----------------------------------------------------------------------------
const emo = {
  JOY: '😂',
  JOY2: '🤣',
  DANCER: '💃',
  STARS: '✨',
  FIRE: '🔥',
  SUN: '☀️',
  TV: '📺',
  NEWSPAPER: '🗞',
  KISS: '😘',
  PENCIL: '✏️',
  DREAM: '🏖',
  EYES: '😜',
  DIZZY: '💫',
  ONE_HUNDRED: '💯',
  SMILE_STAR: '🤩', // Star-struck
  LEFT_FACING_FIST: '🤛', // Left-facing fist
  CHECK_VERDE: '✅', // White check mark (verde)
  CHECK_GRIGIA: '☑️', // Ballot box with check (grigia)
  CROSS_ROSSA: '❌', // X (rossa)
  ENVELOPE: '✉️', // Envelope
  EXCLAMATION_MARK: '❗', // Exclamation mark
  QUESTION_MARK: '❓', // Question mark
  ARROW_RIGHT: '➡️', // Arrow pointing to the right
  INVITATI: '',
  HEART: '❤️',
  BLUE_HEART: '💙',
  GREEN_HEART: '💚',
  YELLOW_HEART: '💛',
  PURPLE_HEART: '💜',
  GIFT_HEART: '💝',
  GIFT: '🎁',
  ROBOT_FACE: '🤖',
  ADMIN: '💁',
  MALE: '💁‍♂️',
  FEMALE: '👩‍🦱',
  INNOCENT: '😇',
  CREDIT_CARD: '💳',
  PERSON: '🧑',
};

MsgBot = {
  OK: ['si', 'ok'],
  CUORE: ['❤️', '💚️', '💜'],
  CIAO: ['ciao', 'ciaoo', 'hola', 'holaa', 'hey', 'salve', 'buongiorno', 'buondi', 'ciao ❤️'],
  CI_SEI: ['ci sei', "c'è qualcuno", "c'è nessuno"],
  CHI_SONO_IO: ['chi sono io', 'chi sono'],
  COME_STAI: ['tutto bene', 'come stai', 'come stai', 'come va', 'come butta', 'come va oggi'],
  COME_TI_CHIAMI: [
    'chi sei',
    'come ti chiami',
    "qual'è il tuo nome",
    "qual'e' il tuo nome",
    'che lavoro fai',
    'di cosa ti occupi',
  ],
  COSA_FAI: ['cosa fai', 'cosa combini', 'che fai'],
  QUANTI_ANNI_HAI: ['quanti anni hai', 'che età hai'],
  SEI_LIBERO_STASERA: [
    'sei libera stasera',
    'sei libero stasera',
    'usciamo insieme',
    "fare l'amore con me",
    'fare sesso',
    'vuoi scopare',
    'vuoi trombare',
  ],
  MI_TROVI_UN_MOROSO: [
    'trovi un moroso',
    'una morosa',
    'fidanzato',
    'fidanzata',
    'trovi un marito',
    'trovi una moglie',
  ],
  CHAT_EMPOWER: ['chat empower'],
  MASCHIO_FEMMINA: ['sei uomo o donna', 'sei maschio o femmina', 'sei ragazzo o ragazza', 'che sesso hai'],
  DAMMI_UN_BACIO: ['dammi un bacio', 'baciami'],
  HAHA: ['hahaha', 'ahah', '😂'],
  MI_AMI: ['mi ami'],
  TI_AMO: ['ti amo', 'ti adoro', 'ti lovvo'],
  PREGO: ['prego', 'Prego ! 💋💋💋'],
  GRAZIE: ['grazie ainy', 'grazie', 'grazie mille', 'graziee', 'grazie ❤', 'grazie️❤', 'grazie 😘', 'grazie😘'],
  PRINCIPE_AZZURRO: ['principe azzurro'],
  START_INV: ['/start inv'],
  COSE_COVID: ["cos'è il covid", 'cosa è il covid'],
  COVID: ['covid'],
  SPOSAMI: ['sposami', 'vuoi sposar', 'sei sposat', 'ci sposiamo', 'ti sposo', 'sei sposat', 'mi sposi'],
  CHE_TEMPO_FA: ['che tempo'],
  NON_TROO_INVITATI: ['non trovo invitati', 'non riesco a trovare invitati'],
  TROVAMI_UN_UOMO_DONNA: ['trovami un uomo', 'trovami una donna', 'esiste una donna per me', 'esiste un uomo per me'],
  PAROLACCE: ['stronz', 'fanculo', 'fottiti', 'cagare', 'ammazzat', 'muori', 'cretino', 'stupido'],
  COME_SI_CHIAMA: ['come si chiama'],
  PROSSIMO_ZOOM: ['prossimo zoom', 'fare lo zoom', 'gli zoom', 'conferenz', 'zoom'],
  LAVAGNA: ['lavagna', 'Lavagna', 'LAVAGNA'],
  SEI_LIBERO_DI_RESPIRARE: ['sei libero di respirare'],
  SEI_LIBERO: ['sei liber', 'sei sposat', 'sei fidanzat', 'sei single'],
  AIUTO: [
    'help',
    'aiuto',
    'ho bisogno di',
    'ho problemi',
    'non riesco',
    'mi puoi aiutare',
    'mi aiuti',
    'aiutami',
    'posso chiederti',
    'puoi aiutarmi',
  ],
  UOMO: ['uomo', 'maschio'],
  SORPRESA: ['noo', 'davvero', 'sii', 'facciamo festa', 'è qui la festa', 'festa'],
  UGUALE: ['👍🏻', '✨', '❤🏻', '⭐', '❤', '❤❤', '🤩'],
  SI: ['si', 'yes'],
  NO: ['no', 'noo'],
  DONNA: ['donna', 'femmina'],
  FARE_DOMANDA: ['fare una domanda', 'posso farti una domanda'],
  DIVENTERO_RICCA: ['diventerò ricc'],
  DOVE_VUOI_VIVERE: ['dove vuoi vivere'],
  MA_ALLORA: ['ma allora'],
};

const MsgRisp = {
  CHAT_EMPOWER:
    'Entra nella Chat EMPOWER !!!\n' +
    'https://t.me/joinchat/C741mkx5QYXu-kyYCYvA8g ' +
    emo.PURPLE_HEART +
    emo.GIFT_HEART +
    emo.BLUE_HEART,
};

function getemojibynumber(number) {
  if (number === 0) {
    return '0️⃣'; // zero
  } else if (number === 1) {
    return '1️⃣'; // one
  } else if (number === 2) {
    return '2️⃣'; // two
  } else if (number === 3) {
    return '3️⃣'; // three
  } else if (number === 4) {
    return '4️⃣'; // four
  } else if (number === 5) {
    return '5️⃣'; // five
  } else if (number === 6) {
    return '6️⃣'; // six
  } else if (number === 7) {
    return '7️⃣'; // seven
  } else if (number === 8) {
    return '8️⃣'; // eight
  } else if (number === 9) {
    return '9️⃣'; // nine
  } else {
    return number;
  }
}

const Menu = {
  LANG_IT: '🇮🇹 Italiano', // Bandiera italiana
  LANG_EN: '🇬🇧 English', // Bandiera del Regno Unito
  LANG_ES: '🇪🇸 Español', // Bandiera spagnola
  LANG_FR: '🇫🇷 Français', // Bandiera francese
  LANG_SI: '🇸🇮 Slovenski', // Bandiera slovena
  LANG_PT: '🇵🇹 Português', // Bandiera portoghese
  LANG: '🌐 Language', // Globo con meridiani
  CHAT_PERSONALE: '👩‍💼💻', // Donna impiegata + computer
  EXIT_TELEGRAM: 'exittotelegram',
  MSG_TO_USER: 'sendmsgto',
  ADMIN: '💁‍♀️ Admin', // Persona al banco informazioni
  AIUTO: '🔮 Help', // Cristallo magico
  ALTRO: '📰 Altro', // Giornale
  SETPICPROFILE: '🖼 SetPicProfile', // Cornice con foto
  RESETPWD: '🔑 SetResetPwd', // Chiave
  MSG_SI_INVITATI_NO_7REQ_INVITATI: '📩Inv e NO 7 Req', // Busta
  MSGSTAFF: '📩 Invia a STAFF', // Busta
  MSGAPPARTIENE_CIRCUITI_RIS: 'Invia a Utenti dei Circuiti RIS',
  MSGPAOLO: '📩 Invia a SURYA', // Busta
  RESTART_SRV: '📩Restart-NodeJs', // Busta
  REBOOT_SRV: '📩Reboot-VPS!', // Busta
  EXECSH: '📩ExecSH', // Busta
  LOG_SRV: '🖥Logserver.sh', // Monitor
  MSGATUTTI: '📩 Invia a TUTTI', // Busta
  it: {
    ACCEDI: '👤 Accedi', // Persona
    LAVAGNA: '🕉 Lavagna', // Simbolo Om
    LINK_CONDIVIDERE: '🔗 Link da condividere', // Link
    ZOOM: 'ℹ️ Zoom (Conferenze)', // Informazione
    INFO: 'ℹ️ Informazioni', // Informazione
    ASSISTENZA: '👐 Le Chat', // Mani aperte
    INDIETRO: '🔙 Indietro', // Freccia indietro
    SI: '👍 SI', // Pollice su
    NO: '👎 NO', // Pollice giù
    ESCI_DA_CHAT: '📩 Esci dalla Conversazione', // Busta
    NUOVOSITO: '',
  },
  es: {
    ACCEDI: '👤 Entra',
    LAVAGNA: '🕉 Tablero',
    LINK_CONDIVIDERE: '🔗 Enlaces para compartir',
    ZOOM: 'ℹ️ Zoom (Conferencias)',
    INFO: 'ℹ️ Información',
    ASSISTENZA: '👐 Chats',
    INDIETRO: '🔙 Volver',
    SI: '👍 SÍ',
    NO: '👎 NO',
    ESCI_DA_CHAT: '📩 Salir de la conversación',
  },
  fr: {
    ACCEDI: '👤 Entrez',
    LAVAGNA: '🕉 Tableau de bord',
    LINK_CONDIVIDERE: '🔗 Liens à partager',
    ZOOM: 'ℹ️ Zoom (Conférences)',
    INFO: 'ℹ️ Informations',
    ASSISTENZA: '👐 Les chats',
    INDIETRO: '🔙 Retour',
    SI: '👍 OUI',
    NO: '👎 NON',
    ESCI_DA_CHAT: '📩 Quitter la conversation',
  },
  si: {
    ACCEDI: '👤 Prijava',
    LAVAGNA: '🕉 Tabla',
    LINK_CONDIVIDERE: '🔗 Link za vpis oseb',
    ZOOM: 'ℹ️ Zoom (Konference)',
    INFO: 'ℹ️ Informacije',
    ASSISTENZA: '👐 jev klepet',
    INDIETRO: '🔙 Nazaj',
    SI: '👍 DA',
    NO: '👎 NE',
    ESCI_DA_CHAT: '📩 Zaprite pogovor',
  },
  pt: {
    ACCEDI: '👤 Entre',
    LAVAGNA: '🕉 Tablero',
    LINK_CONDIVIDERE: '🔗 Links para compartilhar',
    ZOOM: 'ℹ️ Zoom (Conferências)',
    INFO: 'ℹ️ Informações',
    ASSISTENZA: '👐 Chats',
    INDIETRO: '🔙 Voltar',
    SI: '👍 SIM',
    NO: '👎 NÃO',
    ESCI_DA_CHAT: '📩 Sair da Conversa',
  },
  enUs: {
    ACCEDI: '👤 Enter',
    LAVAGNA: '🕉 DashBoard',
    LINK_CONDIVIDERE: '🔗 Link to Share',
    ZOOM: 'ℹ️ Zoom (Conference)',
    INFO: 'ℹ️ Info',
    ASSISTENZA: '👐 Chats',
    INDIETRO: '🔙 Back',
    SI: '👍 YES',
    NO: '👎 NO',
    ESCI_DA_CHAT: '📩 Exit to the Conversation',
  },
};

const CONTA_SOLO = 'contasolo';
const RICEVI_EMAIL = 'riceviemail';
const NOME_COGNOME = 'nomecognome';
const CHEDI_SE_IMBARCARTI = 'chiedi_se_imbarcarti';

const phase = {
  REGISTRATION: 'REGISTRATION',
  REGISTRATION_CONFIRMED: 'REGISTRATION_CONFIRMED',
  RESET_PWD: 'RESET_PWD',
  NOTIFICATION: 'NOTIFICATION',
};

const roles = {
  ADMIN: 'ADMIN',
  MANAGER: 'MANAGER',
  FACILITATORE: 'FACILITATORE',
  EDITOR: 'EDITOR',
  SOCIO: 'SOCIO',
};

// -----------------------------------------------------------------------------
// 🔹 REGISTRY MULTI-BOT (arrTelegram)
// -----------------------------------------------------------------------------
const arrTelegram = [];

function getclTelegByidapp(idapp) {
  const rec = arrTelegram.find((r) => String(r.idapp) === String(idapp));
  return rec ? rec.cl : null;
}
function getclTelegBytoken(token) {
  const rec = arrTelegram.find((r) => r.cl?.token === token);
  return rec ? rec.cl : null;
}

// -----------------------------------------------------------------------------
// 🔹 FUNZIONI LOCALI
// -----------------------------------------------------------------------------
async function local_sendMsgTelegram(idapp, username, text) {
  const teleg_id = await User.TelegIdByUsername(idapp, username);
  const cl = getclTelegByidapp(idapp);
  if (cl && teleg_id) return await cl.sendMsg(teleg_id, text);
  return null;
}

async function local_sendMsgTelegramToTheManagers(idapp, text, msg, username_bo) {
  const managers = await User.getusersManagers(idapp);
  const username = username_bo || msg?.chat?.username;
  const fullmsg = `${emo.ROBOT_FACE}: Da ${tools.getNomeCognomeTelegram(msg)} (${username})\n${text}`;
  if (managers)
    for (const m of managers) {
      const cl = getclTelegByidapp(idapp);
      if (cl && m.profile?.teleg_id)
        await cl.sendMsg(m.profile.teleg_id, fullmsg, undefined, undefined, undefined, undefined, true);
    }
  return true;
}

// -----------------------------------------------------------------------------
// 🔹 CLASSE TELEGRAM
// -----------------------------------------------------------------------------
class Telegram {
  constructor(idapp, bot) {
    this.idapp = idapp;
    this.bot = bot;
    this.token = bot.token;
    this.arrUsers = [];
    this.lastid = 0;
  }

  // Invia un messaggio base
  async sendMsg(chatId, text, parseMode = 'HTML', MyForm = null, message_id, chat_id, ripr_menuPrec, img) {
    if (!chatId) return;
    try {
      await this.bot.sendMessage(chatId, text, { parse_mode: parseMode });
    } catch (err) {
      console.error('❌ sendMsg error:', err.message);
    }
  }

  // Invia immagine con fallback
  async sendImageToTelegram(chatId, imgPath, caption = '') {
    if (!chatId || !imgPath) return;
    try {
      const buffer = fs.readFileSync(imgPath);
      const sharped = await sharp(buffer).resize({ width: 1280 }).toBuffer();
      await this.bot.sendPhoto(chatId, sharped, { caption });
    } catch (err) {
      console.error('⚠️ sendImageToTelegram fallback:', err.message);
      try {
        await this.bot.sendDocument(chatId, imgPath, { caption });
      } catch (e) {
        console.error('❌ sendDocument fallback:', e.message);
      }
    }
  }

  // Placeholder per ricezione messaggi
  async receiveMsg(msg) {
    console.log('💬', this.idapp, msg.text);
  }

  // Placeholder per start
  async start(msg) {
    await this.sendMsg(msg.chat.id, `${emo.ROBOT_FACE} Benvenuto nel bot ${tools.getNomeAppByIdApp(this.idapp)}!`);
  }

  // Inline keyboard esempio
  getInlineKeyboard(buttons) {
    return { reply_markup: { inline_keyboard: buttons } };
  }
}

// -----------------------------------------------------------------------------
// 🔹 API PUBBLICHE
// -----------------------------------------------------------------------------
async function sendMsgTelegramToTheAdminAllSites(text, senzaintestazione) {
  const apps = await tools.getApps();
  for (const app of apps) {
    const filled = text.replace('{appname}', tools.getNomeAppByIdApp(app.idapp));
    await sendMsgTelegramToTheAdmin(app.idapp, filled, senzaintestazione);
  }
}

async function sendMsgTelegramToTheAdmin(idapp, text, senzaintestazione) {
  const usersadmin = await User.getusersAdmin(idapp);
  let head = emo.ROBOT_FACE + '[BOT-ADMIN]' + emo.ADMIN + ': ';
  if (senzaintestazione) head = '';
  if (usersadmin)
    for (const rec of usersadmin) {
      if (User.isAdmin(rec.perm)) {
        await sendMsgTelegramByIdTelegram(idapp, rec.profile.teleg_id, head + text);
        await tools.snooze(300);
      }
    }
  return true;
}

async function sendMsgTelegramByIdTelegram(idapp, idtelegram, text, message_id, chat_id, ripr_menuPrec, MyForm = null, img = '') {
  if (!idtelegram) return;
  const cl = getclTelegByidapp(idapp);
  if (cl) return await cl.sendMsg(idtelegram, text, null, MyForm, message_id, chat_id, ripr_menuPrec, img, { idapp });
}

async function sendMsgTelegramToTheManagers(idapp, text) {
  const managers = await User.getusersManagers(idapp);
  if (managers)
    for (const rec of managers) {
      await sendMsgTelegramByIdTelegram(idapp, rec.profile.teleg_id, text);
      await tools.snooze(300);
    }
  return true;
}

// -----------------------------------------------------------------------------
// 🔹 CALLBACK QUERY HANDLER (semplificata ma compatibile)
// -----------------------------------------------------------------------------
function setupCallback(bot, cl) {
  bot.on('callback_query', async (callbackQuery) => {
    await handleCallback(bot, cl, callbackQuery);
  });
}

// -----------------------------------------------------------------------------
// 🔹 INIZIALIZZAZIONE BOT MULTI-APP
// -----------------------------------------------------------------------------
async function initTelegramBots() {
  const arrApps = await tools.getApps();
  for (const app of arrApps) {
    const idapp = app.idapp;
    const token = tools.getTelegramKeyByIdApp(idapp);
    const nomebot = tools.getTelegramBotNameByIdApp(idapp);
    if (!token) continue;

    console.log(`🤖 Avvio BOT: ${nomebot} (${idapp})`);
    const bot = new TelegramBot(token, { polling: true });
    const cl = new Telegram(idapp, bot);
    arrTelegram.push({ idapp, cl });

    bot.onText(/\/start/, (msg) => cl.start(msg));
    bot.on('message', async (msg) => cl.receiveMsg(msg));
    setupCallback(bot, cl);
  }
}

// -----------------------------------------------------------------------------
// 🔹 ESPORTAZIONI PUBBLICHE
// -----------------------------------------------------------------------------
module.exports = {
  Telegram,
  initTelegramBots,
  getclTelegByidapp,
  getclTelegBytoken,
  sendMsgTelegramToTheAdminAllSites,
  sendMsgTelegramToTheAdmin,
  sendMsgTelegramByIdTelegram,
  sendMsgTelegramToTheManagers,
  local_sendMsgTelegram,
  local_sendMsgTelegramToTheManagers,
  phase,
  roles,
  emo,
};
