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,
drop
} = global.utils;
const newpve = new Scenes.BaseScene('NEWPVE');
const resultTier = [
  {hit: 'Head', droprate: 10},
  {hit: 'Chest', droprate: 14},
  {hit: 'Stom', droprate: 16},
  {hit: 'Arms', droprate: 18},
  {hit: 'Legs', droprate: 20},
  {hit: 'Miss', droprate: 22}
]

newpve.enter(async (ctx) => {
  let property = await PropertyModel.findByPk(ctx.from.id)
  let mainMessage = await ctx.reply(`Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}`, Markup.inlineKeyboard([
    [{text: '👮', callback_data: `HIT_HEAD`}], 
    [{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}],
    [{text: '👖', callback_data: `HIT_STOM`}],
    [{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}],
]));
ctx.session.mainMessage = mainMessage
ctx.session.battlelog = `\nBattle Log:\n`
});

newpve.on('callback_query', async (ctx, next) => {
  ctx.session.stage = `SHOP_KILL_CASHIER`
  setTimeout(() => {
    if(ctx.session.enemy.hp <= 0){
    switch(ctx.session.stage){
      case 'SHOP_KILL_CASHIER': case 'SHOP_GUARD_KILL': case 'SHOP_GUARD_STEALTH':
        ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} }
              return ctx.sendMessage('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([
              [{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}], 
              //[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}], 
              //[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}]
          ]))
      case 'SHOP_CASH_SMASH':
        ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} }
        return ctx.sendMessage('Вы завершили перестрелку с полицией, пора валить.', Markup.inlineKeyboard([
          [{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
      ]))
      default:
        return ctx.sendMessage('Ошибка выхода из сцены => DEBUG', Markup.inlineKeyboard([
          [{text: 'Завершить ограбление [Магазин]', callback_data: `SHOP_END`}]
      ]))
}
  }
  }, 500);
  
  return next().then(() => {
})
})

newpve.action('HIT_HEAD', async (ctx) => {
  let result = drop(resultTier)
  let msg = ctx.session.mainMessage
  if(rand(1,100) >= 25){
    ctx.session.battlelog += `\nВы промахиваетесь!\n${ctx.session.enemy.name} наносит вам 10 урона.`
  }else{
    let enemyHP = ctx.session.enemy.hp
    let property = await PropertyModel.findByPk(ctx.from.id)
    enemyHP = enemyHP - (property.weapon.damage*1000)*10
    ctx.session.enemy.hp = enemyHP
    ctx.session.battlelog += `\nВы попадаете в голову: ${(property.weapon.damage*1000)*10} урона.`
  }
  await bot.telegram.editMessageText(
    msg.chat.id,   // ID чата
    msg.message_id,  // ID сообщения, которое вы хотите изменить
    undefined,  // Inline-клавиатуру оставьте неопределенной, чтобы она не изменилась
    `Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}` + ctx.session.battlelog, Markup.inlineKeyboard([
      [{text: '👮', callback_data: `HIT_HEAD`}], 
      [{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}],
      [{text: '👖', callback_data: `HIT_STOM`}],
      [{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}],
  ])
    )
})

newpve.action('HIT_CHEST', async (ctx) => {
  let result = drop(resultTier)
  let msg = ctx.session.mainMessage
  if(rand(1,100) >= 50){
    ctx.session.battlelog += `\nВы промахиваетесь!\n${ctx.session.enemy.name} наносит вам 10 урона.`
  }else{
    let enemyHP = ctx.session.enemy.hp
    let enemyArmor = ctx.session.enemy.armor
    let property = await PropertyModel.findByPk(ctx.from.id)
    if(enemyArmor > 0){
      enemyArmor = enemyArmor - (property.weapon.damage*1000)*5
      if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor
      ctx.session.battlelog += `\nВы попадаете в бронежилет: ${(property.weapon.damage*1000)*5} урона.`
    }else{
      enemyHP = enemyHP - (property.weapon.damage*1000)*5
      ctx.session.battlelog += `\nВы попадаете в грудь: ${(property.weapon.damage*1000)*5} урона.`
    }
    ctx.session.enemy.armor = enemyArmor
    ctx.session.enemy.hp = enemyHP
  }
  await bot.telegram.editMessageText(
    msg.chat.id,   // ID чата
    msg.message_id,  // ID сообщения, которое вы хотите изменить
    undefined,  // Inline-клавиатуру оставьте неопределенной, чтобы она не изменилась
    `Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}` + ctx.session.battlelog, Markup.inlineKeyboard([
      [{text: '👮', callback_data: `HIT_HEAD`}], 
      [{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}],
      [{text: '👖', callback_data: `HIT_STOM`}],
      [{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}],
  ])
    )
})

newpve.action('HIT_LEG', async (ctx) => {
  let result = drop(resultTier)
  let msg = ctx.session.mainMessage
  if(rand(1,100) >= 70){
    ctx.session.battlelog += `\nВы промахиваетесь!\n${ctx.session.enemy.name} наносит вам 10 урона.`
  }else{
    let enemyHP = ctx.session.enemy.hp
    let property = await PropertyModel.findByPk(ctx.from.id)
    enemyHP = enemyHP - (property.weapon.damage*1000)/1.5
    ctx.session.enemy.hp = enemyHP
    ctx.session.battlelog += `\nВы попадаете в ногу: ${(property.weapon.damage*1000)/1.5} урона.`
  }
    await bot.telegram.editMessageText(
    msg.chat.id,   // ID чата
    msg.message_id,  // ID сообщения, которое вы хотите изменить
    undefined,  // Inline-клавиатуру оставьте неопределенной, чтобы она не изменилась
    `Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}` + ctx.session.battlelog, Markup.inlineKeyboard([
      [{text: '👮', callback_data: `HIT_HEAD`}], 
      [{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}],
      [{text: '👖', callback_data: `HIT_STOM`}],
      [{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}],
  ])
    )
  
})

newpve.action('attack', async (ctx) => {
  let enemyHP = ctx.session.enemy.hp
  let enemyArmor = ctx.session.enemy.armor
  let property = await PropertyModel.findByPk(ctx.from.id)
  
  let result = drop(resultTier)
  console.log(result)
    switch(result.hit){
        case 'Head':
            enemyHP = enemyHP - (property.weapon.damage*1000)*10
              ctx.reply(`Enemy Head: HP:${enemyHP} Armor: ${enemyArmor}`)
            break;
        case 'Chest':
            if(enemyArmor > 0){
              enemyArmor = enemyArmor - (property.weapon.damage*1000)*5
              if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor
                ctx.reply(`Enemy Chest: HP:${enemyHP} Armor: ${enemyArmor}`) 
            }else{
              enemyHP = enemyHP - (property.weapon.damage*1000)*5
                ctx.reply(`Enemy Chest: HP:${enemyHP} Armor: ${enemyArmor}`)
            }
            break;
        case 'Stom':
            if(enemyArmor > 0){
                 enemyArmor = enemyArmor - (property.weapon.damage*1000)*3
                 if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor
                 ctx.reply(`Enemy Stom: HP:${enemyHP} Armor: ${enemyArmor}`) 
             }else{
                 enemyHP = enemyHP - (property.weapon.damage*1000)*3
                 ctx.reply(`Enemy Stom: HP:${enemyHP} Armor: ${enemyArmor}`)
             }
            break;
        case 'Arms':
                 enemyHP = enemyHP - (property.weapon.damage*1000)/2
                 ctx.reply(`Enemy Arms: HP:${enemyHP} Armor: ${enemyArmor}`)
            break;
        case 'Legs':
                enemyHP = enemyHP - (property.weapon.damage*1000)/1.5
                ctx.reply(`Enemy Legs: HP:${enemyHP} Armor: ${enemyArmor}`)
            break;
        case 'Miss':
            ctx.reply(`Промах, лох`)
            break;
    }
  ctx.session.enemy.hp = enemyHP
  ctx.session.enemy.armor = enemyArmor
  if (enemyHP <= 0) {
    console.log(ctx.session)
    switch(ctx.session.stage){
      case 'SHOP_KILL_CASHIER': case 'SHOP_GUARD_KILL': case 'SHOP_GUARD_STEALTH':
        ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} }
              return ctx.sendMessage('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([
              [{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}], 
              //[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}], 
              //[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}]
          ]))
      case 'SHOP_CASH_SMASH':
        ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} }
        return ctx.sendMessage('Вы завершили перестрелку с полицией, пора валить.', Markup.inlineKeyboard([
          [{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
      ]))
      default:
        return ctx.sendMessage('Ошибка выхода из сцены => DEBUG', Markup.inlineKeyboard([
          [{text: 'Завершить ограбление [Магазин]', callback_data: `SHOP_END`}]
      ]))
}
  } else {
    // Противник еще жив, отправляем сообщение с обновленным HP и кнопкой для атаки
    let enemyDmg = rand(0, 10)
    ctx.session.user.hp -= enemyDmg
    if(ctx.session.user.hp <= 0) {
      ctx.editMessageText(`${ctx.session.enemy.name} наносит вам ${enemyDmg} урона.\n Осталось HP: ${ctx.session.user.hp}\nВы критически ранены!`, Markup.inlineKeyboard([
        [
          {text: 'Завершить ограбление', callback_data: `SHOP_END`}
        ]
      ]))
    }
    ctx.sendMessage(`${ctx.session.enemy.name} наносит вам ${enemyDmg} урона.\n Осталось HP: ${ctx.session.user.hp}`)
    ctx.editMessageText(`Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}`, Markup.inlineKeyboard([
      [
          {text: `${property.weapon.name}`, callback_data: `attack`}
      ]
    ]));
  }
});

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

module.exports = newpve