const {
  Telegraf,
  Scenes,
  Markup
} = require('telegraf')
const bot = new Telegraf(process.env.BOT_TOKEN)
const {
slots,
phones,
UserModel,
WorldModel,
SkillsModel,
PropertyModel
} = global.config
const {
spaces,
getSlot,
giveExp,
rand,
random,
setCooldown
} = global.utils;
const shop = new Scenes.BaseScene('SHOP_ROBBERY');

bot.on('callback_query', (ctx) => {
  const buttonId = ctx.update.callback_query;
  console.log(buttonId)
});

shop.enter(async (ctx) => {
  let user = await UserModel.findByPk(ctx.from.id)
  let property = await PropertyModel.findByPk(ctx.from.id);
  if(user.level < 8) return ctx.editMessageText('Доступно с 8 уровня!')
  if(property.weapon == 0) return ctx.editMessageText('Для данного задания нужен ствол.')
  let shoprobcd = user.shoprobcd
  let cooldown = setCooldown(user, 3600, shoprobcd)
  if (user.shoprobcd > cooldown.currentTime) return ctx.editMessageText(`📛 Данное действие будет доступно через ${cooldown.timeLeftInMinutes} мин.`);
  user.shoprobcd = cooldown.endTime
  user.save()
  ctx.editMessageText('Выберите режим', Markup.inlineKeyboard([
    [
      {text: 'SOLO', callback_data: `SHOP_SOLO`}, 
      {text: 'DUO', callback_data: `SHOP_DUO`}, 
      {text: 'GROUP', callback_data: `SHOP_GROUP`},
      {text: 'ADMIN', callback_data: `SHOP_ADMIN`}
  ]
]).resize())
});

shop.action(`SHOP_DUO`, async (ctx) => {
  ctx.reply(`Еще не доступно.`)
});

shop.action(`SHOP_GROUP`, async (ctx) => {
  ctx.reply(`Еще не доступно.`)
});



shop.action(`DEBUG_PVE`, async (ctx) => {
  let user = await UserModel.findByPk(ctx.from.id)
  let skill = await SkillsModel.findByPk(ctx.from.id)
    ctx.session.enemy = {
      name: 'Полицейский',
      hp: 100,
      armor: 100
    }
    return ctx.scene.enter('NEWPVE')
});



shop.action(`SHOP_ADMIN`, async (ctx) => {
  let user = await UserModel.findByPk(ctx.from.id)
  if(user.status != 'admin') return ctx.editMessageText(`Написано же ADMIN блять.`)
  return ctx.editMessageText('Admin Panel', Markup.inlineKeyboard([
    [{text: 'New PVE', callback_data: `DEBUG_PVE`}], 
    [{text: 'Убить охранника [Владение оружием]', callback_data: `SHOP_GUARD_KILL`}]
]))
});

shop.action(`SHOP_SOLO`, async (ctx) => {
  let property = await PropertyModel.findByPk(ctx.from.id);
  if(property.equipment != 0){
    ctx.session.user = {
      hp: 100,
      armor: property.equipment.armor
    }
  }else{
    ctx.session.user = {
      hp: 100,
      armor: 0
    }
  }
  
  ctx.editMessageText('Стадии:', Markup.inlineKeyboard([
    [
      {text: 'Вход', callback_data: `SHOP_ENTER`},
      //{text: 'Охранник [DEV]', callback_data: `SHOP_ENTER`},
      //{text: 'Отчет', callback_data: `SHOP_CASH_BREAK_SUCCESS`}
  ]
]))
});

shop.action(`SHOP_ENTER`, async (ctx) => {
  let skill = await SkillsModel.findByPk(ctx.from.id)
  let chance = rand(0, 100)
  chance += skill.stealing.level
  if(chance < 70) {
    return ctx.editMessageText('Вы заметили охранника, с ним нужно что-то сделать...', Markup.inlineKeyboard([
        [{text: 'Избавиться от охранника [Скрытность]', callback_data: `SHOP_GUARD_STEALTH`}], 
        [{text: 'Убить охранника [Владение оружием]', callback_data: `SHOP_GUARD_KILL`}]
  ]))
  }
  return ctx.editMessageText('Стадии:', Markup.inlineKeyboard([
      [{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}], 
      //[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}], 
      //[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}]
]))
});

shop.action(`SHOP_GUARD`, async (ctx) => {
  let skill = await SkillsModel.findByPk(ctx.from.id)
  let chance = rand(0, 100)
  chance += skill.stealing.level
  return ctx.editMessageText('Стадии:', Markup.inlineKeyboard([
      [{text: 'Избавиться от охранника [Скрытность]', callback_data: `SHOP_GUARD_STEALTH`}], 
      [{text: 'Убить охранника [Владение оружием]', callback_data: `SHOP_GUARD_KILL`}]
]))
});

shop.action(`SHOP_GUARD_STEALTH`, async (ctx) => {
  let skill = await SkillsModel.findByPk(ctx.from.id)
  let chance = rand(0, 100)
  chance += skill.stealing.level
  if(chance < 40) {
    ctx.session.stage = 'SHOP_GUARD_STEALTH'
    ctx.reply(`Нападение!`)
    ctx.session.enemy = {
      name: 'Охранник',
      hp: 100,
      armor: 20
    }
    return ctx.scene.enter('PVE')
  }
  return ctx.editMessageText('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([
    [{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}], 
    //[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}], 
    //[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}]
]))
});

shop.action(`SHOP_GUARD_KILL`, async (ctx) => {
  let skill = await SkillsModel.findByPk(ctx.from.id)
  let chance = rand(0, 100)
  chance += skill.stealing.level
  if(chance > 10) {
    ctx.session.stage = 'SHOP_GUARD_KILL'
    ctx.session.enemy = {
      name: 'Охранник',
      hp: 1000,
      armor: 20
    }
    return ctx.scene.enter('PVE')
  }
  return ctx.editMessageText('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([
    [{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}], 
    //[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}], 
    //[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}]
]))
});

shop.action(`SHOP_KILL_CASHIER`, async (ctx) => {
  let skill = await SkillsModel.findByPk(ctx.from.id)
  let chance = rand(0, 100)
  chance += skill.stealing.level
  if(chance < 60 && !ctx.session.enemy) {
    ctx.session.stage = 'SHOP_KILL_CASHIER'
    ctx.editMessageText('Вы заметили охранника, с ним нужно что-то сделать...');
    ctx.session.enemy = {
      name: 'Охранник',
      hp: 100,
      armor: 20
    }
    return ctx.scene.enter('PVE')
  }
  return ctx.editMessageText('Стадии:', Markup.inlineKeyboard([
      [{text: 'Взлом кассы', callback_data: `SHOP_CASH_BREAK`}], 
      [{text: 'Разбить кассу', callback_data: `SHOP_CASH_SMASH`}]
]))
});

shop.action(`SHOP_CASH_BREAK`, async (ctx) => {
  let user = await UserModel.findByPk(ctx.from.id)
  let skill = await SkillsModel.findByPk(ctx.from.id)
  let chance = rand(0, 100)
  chance += skill.lockpick.level
  let cashIn = rand(1000, 10000)
  let timer = 1000
  if(chance < 99) {
    const keyboard = generateKeyboard();
    ctx.deleteMessage()
    return ctx.reply('Взлом замка:', keyboard);
    //ctx.editMessageText('Вы начали взлом кассы.');
    //return ctx.scene.enter('LOCKPICK')
  }
  for(i=0; i<rand(6,15);i++){
    setTimeout(() => {
    cashIn += rand(1000, 10000)
    ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`)
  }, timer)
  timer += 500
  }
setTimeout(() => {
user.dirtymoney += cashIn
user.save()
return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([
  [{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
]))
}, timer+300)
});

shop.action(`SHOP_CASH_SMASH`, async (ctx) => {
  let user = await UserModel.findByPk(ctx.from.id)
  let skill = await SkillsModel.findByPk(ctx.from.id)
  let chance = rand(0, 100)
  let cashIn = rand(1000, 10000)
  let timer = 1000
  if(chance < 50) {
    ctx.editMessageText('Вы разбили кассовый аппарат, и сработала сигнализация.')
    ctx.session.stage = 'SHOP_CASH_SMASH'
    ctx.session.enemy = {
      name: 'Полицейский',
      hp: 100,
      armor: 100
    }
    for(i=0; i<rand(3,10);i++){
      setTimeout(() => {
      cashIn += rand(1000, 10000)
      ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`)
    }, timer)
    timer += 500
    }
  setTimeout(() => {
  user.dirtymoney += cashIn
  user.save()
  return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`)
  }, timer+300)
    return ctx.scene.enter('PVE')
  }
  for(i=0; i<rand(3,10);i++){
    setTimeout(() => {
    cashIn += rand(1000, 10000)
    ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`)
  }, timer)
  timer += 500
  }
setTimeout(() => {
user.dirtymoney += cashIn
user.save()
return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([
  [{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
]))
}, timer+300)
});

shop.action(`SHOP_CASH_BREAK_SUCCESS`, async (ctx) => {
  let user = await UserModel.findByPk(ctx.from.id)
  let cashIn = rand(1000, 10000)
  let timer = 100
    for(i=0; i<rand(6,15);i++){
      setTimeout(() => {
      cashIn += rand(1000, 10000)
      ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`)
    }, timer)
    timer += 500
    }
  setTimeout(() => {
  user.dirtymoney += cashIn
  user.save()
  return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([
    [{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
]))
}, timer+300)
});

shop.action(`SHOP_END`, async (ctx) => {
  ctx.editMessageText('Ограбление завершено!')
  return ctx.scene.leave();
});

shop.action(/lock_*/, (ctx) => {
  const buttonId = ctx.update.callback_query.data;
  ctx.answerCbQuery(`Штифт не сдвинулся.`);
  removeButton(ctx, buttonId);
});

function generateKeyboard() {
  const buttonsCount = 10;
  const buttons = [];
  const winButton = rand(1, 10)
  
  for (let i = 1; i <= buttonsCount; i++) {
    if(i == winButton){
      buttons.push({ text: `🔒`, callback_data: `SHOP_CASH_BREAK_SUCCESS` })
    }else{
      buttons.push({ text: `🔒`, callback_data: `lock_${i}` })
    }
  }
  let rows = []
    while (buttons.length > 0) {
        rows.push(buttons.splice(0, 5)) // разбиваем на подмассивы по 5 кнопок
    }
  return {
    reply_markup: {
      inline_keyboard: rows,
    },
  };
}

shop.leave((ctx) => {
  console.log('Завершено');
}); 

function removeButton(ctx, buttonId) {
  const keyboard = ctx.update.callback_query.message.reply_markup.inline_keyboard;
  
  for (let row of keyboard) {
    for (let i = 0; i < row.length; i++) {
      if (row[i].callback_data === buttonId) {
        row[i].text = `🔓`
        break;
      }
    }
  }
  
  if (keyboard.flat().length === 0) {
    console.log(`Lockpick completed`)
  } else {
    console.log(keyboard)
    ctx.editMessageText('Взлом замка:', Markup.inlineKeyboard(keyboard));
  }
}

module.exports = shop