require('dotenv').config()
const {
    Telegraf,
    Markup
} = require('telegraf')
const shortid = require('shortid');
const voucher_codes = require('voucher-code-generator');
const { createCanvas, loadImage } = require('canvas');
const fs = require('fs')
const bot = new Telegraf(process.env.BOT_TOKEN)
const weaponshop = require('./json/weaponshop.json')
const slots = require('./json/slots.json')
const rarecars = require('./json/rarecars.json')
const simplecars = require('./json/simplecars.json')
const houses = require('./presets/houses.json')
const cars = require('./presets/cars.json')
const phones = require('./presets/mobiles.json')
const weapons = require('./presets/weapons.json')
const equipment = require('./presets/equipment.json')
const sequelize = require('./db');
const { Op } = require('sequelize');
const UserModel = require('./models/user.model');
const WorldModel = require('./models/world.model');
const JobModel = require('./models/job.model');
const PropertyModel = require('./models/property.model');
const BusinessModel = require('./models/business.model');
const ReportModel = require('./models/report.model');
const BlockModel = require('./models/block.model');
const PromocodeModel = require('./models/promocode.model');
const mainChat = -1001895132127
const adminList = [275416286]
const expToUp = [0, 10, 20, 40, 60, 100, 250, 370, 450, 575, 666, 777, 860, 999, 1000, 1177, 1234, 1350, 1488, 1515, 1610]
const topSym = ['🥇', '🥈', '🥉', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟']

const start = async () => {
    try {
        await sequelize.authenticate()
        await sequelize.sync()
    } catch (e) {
        console.log('Подключение к бд сломалось', e)
    }
}

bot.telegram.setMyCommands([{
        command: "pay",
        description: "Перевести указанному пользователю сумму."
    },
    {
        command: "buy",
        description: "Приобрести указанное имущество."
    },
    {
        command: "business",
        description: "Создать организацию."
    },
    {
        command: "invite",
        description: "Пригласить пользователя в организацию."
    },
    {
        command: "percent",
        description: "Установить пользователю процент заработка."
    },
    {
        command: "report",
        description: "Создать жалобу/обращение/идею."
    }
])

bot.use(async (ctx, next) => {
    let id = ctx.from.id
    let username = ctx.from.username
    if(username == null) username = ctx.from.id
    try {
      console.log(getCurrentTime() + `: ` + username + `: ` + ctx.update.message.text)
    } catch (e) {
        console.log(getCurrentTime() + `: ${username}: ${ctx.update.callback_query.data}`)
    }
    let user = await UserModel.findByPk(id);
    let block = await BlockModel.findByPk(id);
    let property = await PropertyModel.findByPk(id);
    if (!user) ctx.reply(`❕ Первичная регистрация профиля.`);
    if (user === null) {
        await UserModel.create({
            telegram_id: id,
            username: username,
            name: ctx.from.first_name
        })
    } else {
      user.name = ctx.from.first_name
      if(user.username === null) user.username = ctx.from.id
      user.save()
    }
    if (property === null) {
        await PropertyModel.create({
            telegram_id: id
        })
    } else {}
    //if (whitelist.includes(id) == false) return ctx.reply(`У вас пока нет доступа к боту. Следите за обновлениями в группе: t.me/CampFireGameBotNews`)
    if (block !== null) {
        if (block.isBlocked == true && block.time > Date.now() / 1000) return ctx.reply(`📛 У вас активная блокировка по причине: ${block.reason}.\n⏲️ Оставшееся время: ${Math.trunc((block.time - Date.now()/1000)/60)} мин.`)
        block.isBlocked = false
        block.save()
    }
    const start = Date.now()
    return next().then(() => {
        const ms = Date.now() - start
        console.log('response time %sms', ms)
    })
})

bot.command('start', async (ctx) => {
    if (ctx.payload) {
        let id = ctx.from.id
        let user = await UserModel.findByPk(id);
        if (user.level == 1) {
            let ref = await UserModel.findByPk(ctx.payload)
            let world = await WorldModel.findByPk(1)
            world.balance -= 25000
            ref.money += Number(25000)
            await ref.save()
            await world.save()
            bot.telegram.sendMessage(ref.telegram_id, `${ctx.from.username} зарегистрировался по вашей реферальной ссылке. Получено ¤25.000`)
            console.log("Transaction to Ref")
        } else {
            console.log("Exist")
        }
    }
    return await ctx.reply('Главное меню', Markup
        .keyboard([
            ['😎 Профиль'], // Row1 with 2 buttons
            ['🗄️ Работать', '🌐 Организация', '🎁 Бонус', '🏯 Казино'], // Row2 with 2 buttons
            ['📦 Контейнеры'],
            ['📢 Вакансии', '🔵 Имущество', '📞 Пригласить'] // Row3 with 3 buttons
        ])
        .resize()
    )
})

bot.hears('▶️ Меню', async (ctx) => {
    return await ctx.reply('Main Menu', Markup
        .keyboard([
            ['😎 Профиль'],
            ['🗄️ Работать', '🌐 Организация', '🎁 Бонус', '🏯 Казино'],
            ['📦 Контейнеры'],
            ['📢 Вакансии', '🔵 Имущество', '📞 Пригласить']
        ])
        .resize()
    )
});

bot.hears('Чат', async (ctx) => {
    ctx.telegram.sendMessage(mainChat, `Automatic message`)
});

bot.hears('😎 Профиль', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id);
    let property = await PropertyModel.findByPk(ctx.from.id);
    if (!user) return ctx.reply(`Ошибка #1`);
    return ctx.replyWithMarkdownV2(`
      👤${escape(user.username)} ${user.status == 'bronze' ? `\\[🔺\\]` : ""}${user.status == 'silver' ? `\\[🔹\\]` : ""}${user.status == 'gold' ? `\\[🔸\\]` : ""}${user.status == 'admin' ? "✅" : ""}
      🆔: ${ctx.from.id}

      📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]}
      ⏩ Повышается за различные действия\\.
      
      💰 Баланс
      ¤${spacesWithMarkdown(user.money)}

      🔵 Имущество
      🏠 Жилье: ${property.house == 0 ? "Бездомный" : property.house.name}
      🚗 Автомобиль: ${property.car == 0 ? "Пешком" : escape(property.car.name)}
      📱 Телефон: ${property.mobile == 0 ? "Нет" : property.mobile.name}
      🔫 Оружие: ${property.weapon == 0 ? "Безоружный" : property.weapon.name}
      🥼 Экипировка: ${property.equipment == 0 ? "Нет" : property.equipment.name}
      `);

});

bot.command('getprofile', async (ctx) => {
    if(!ctx.message.reply_to_message) return await ctx.reply(`Только на пересланное сообщение.`)
    let id = ctx.message.reply_to_message.from.id
    let user = await UserModel.findByPk(id);
    let property = await PropertyModel.findByPk(id);
    return ctx.replyWithMarkdownV2(`
      👤${escape(user.username)} ${user.status == 'bronze' ? `\\[🔺\\]` : ""}${user.status == 'silver' ? `\\[🔹\\]` : ""}${user.status == 'gold' ? `\\[🔸\\]` : ""}${user.status == 'admin' ? "Administrator" : ""}
      🆔: ${ctx.from.id}

      📶 Уровень: ${user.level} \\| ${user.exp} / ${expToUp[user.level]}
      ⏩ Повышается за различные действия\\.
      
      💰 Баланс
      ¤${spacesWithMarkdown(user.money)}

      🔵 Имущество
      🏠 Жилье: ${property.house == 0 ? "Бездомный" : property.house.name}
      🚗 Автомобиль: ${property.car == 0 ? "Пешком" : property.car.name}
      📱 Телефон: ${property.mobile == 0 ? "Нет" : property.mobile.name}
      🔫 Оружие: ${property.weapon == 0 ? "Безоружный" : property.weapon.name}
      🥼 Экипировка: ${property.equipment == 0 ? "Нет" : property.equipment.name}
      `);

});

bot.hears('Рандом', async (ctx) => {
    let users = await UserModel.findAll();
    let chosenOne = users.random()
    return ctx.reply(`
      👤 ${chosenOne.username} 
      🆔: ${chosenOne.telegram_id}
      `);

});

bot.hears('💳 Баланс', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id);
    return ctx.reply(`
      ⏩ Аккаунт игрока ${user.username}
      &#127380; Игрока: ${user.telegram_id}

      📶 Уровень: ${user.level}
      ⏩ Повышается за различные действия.

      💰 Баланс: 
      ¤${user.money}
    `);
})

bot.hears('🎁 Бонус', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id);
    if (!user) return ctx.reply(`Ошибка #1`);
    let bonustime = user.bonustime
    let cooldown = setCooldown(user, 3600, bonustime)
    if (user.bonustime > cooldown.currentTime) return ctx.reply(`📛 Забрать бонус можно будет через ${cooldown.timeLeftInMinutes} минут(у/ы)`);
    user.bonus = 1;
    user.bonustime = cooldown.endTime
    let world = await WorldModel.findByPk(1)
    let text = ``;
    let money = [100, 200, 300, 400, 500, 1000].random();
    if (user.level >= 5) {
        money += money;
    }
    let r = rand(1, 2);
    let x = rand(2, 7);
    if (r == 1) {
        text += `⏩ ¤${money}\n`;
    }
    if (r == 2) {
        money = money*x
        text += `⏩ ¤${money}\n`;
    }
    switch(user.status){
        case 'bronze':
            user.money += 5000
            text += `⭐ Дополнительный бонус за Bronze:\n⏩ ¤5.000\n`
            break;
        case 'silver':
            user.money += 15000
            text += `⭐ Дополнительный бонус за Silver:\n⏩ ¤15.000\n`
            break;
        case 'gold':
            user.money += 30000
            text += `⭐ Дополнительный бонус за Gold:\n⏩ ¤30.000\n`
            break;
    }
    user.money += money;
    world.balance -= money
    if (user.business.id == 0){
      await user.save();
      await world.save();
      return ctx.reply(`
      ⭐ Из ежечасного бонуса Вам выпало:
${text}
      `)
    }
    let business = await BusinessModel.findOne({
      where: {
        owner: user.business.id
      }
    })
    if(business != null){
      let mats = rand(3, 10)
      switch(user.status){
        case 'bronze':
            business.materials += 5
            text += `⭐ Дополнительный бонус за Bronze:\n⏩ 5 материалов\n`
            break;
        case 'silver':
            business.materials += 10
            text += `⭐ Дополнительный бонус за Silver:\n⏩ 10 материалов\n`
            break;
        case 'gold':
            business.materials += 20
            text += `⭐ Дополнительный бонус за Gold:\n⏩ 20 материалов\n`
            break;
    }
      text += `⏩ ${mats} материалов в организацию\n`
      business.materials += mats
      business.save()
    }
    await user.save();
    await world.save();
    return ctx.reply(`
      ⭐ Из ежечасного бонуса Вам выпало:
${text}
      `)
})

bot.command('pay', async (ctx) => {
    ctx.args = ctx.update.message.text.split(' ')
    if (!ctx.args[1] || !ctx.args[2]) return ctx.reply(`/pay [Никнейм] [Сумма]`)
    if (!Number(ctx.args[2])) return ctx.reply(`❕ Сумма должна быть числовая.`)
    let sender = await UserModel.findByPk(ctx.from.id);
    let receiver = await UserModel.findOne({
        where: {
            username: ctx.args[1]
        }
    });
    let world = await WorldModel.findByPk(1)
    let fee = Number(Math.trunc(ctx.args[2] / 100 * world.transactionfee))
    if (ctx.args[2] == 0 || ctx.args[2] < 100) return ctx.reply(`❕ Минимальная сумма перевода ¤100.`)
    if (sender.money < ctx.args[2]) return ctx.reply(`❕ Недостаточно средств!`)
    if (sender.money < Number(ctx.args[2]) + fee) return ctx.reply(`❕ Недостаточно средств для перевода с комиссией!`)
    sender.money -= Number(ctx.args[2])
    sender.money -= Number(fee)
    world.balance += Number(fee)
    await sender.save();
    await world.save();
    receiver.money += Number(ctx.args[2])
    await receiver.save();
    let pmToReceiver = `🔽 Входящий перевод.\n\n🔼 Отправитель: ${sender.username}\n🆔 Отправителя: ${sender.telegram_id}\n🔢 Сумма: ¤${ctx.args[2]}\n🆕 Ваш баланс: ¤${receiver.money}
    `
    bot.telegram.sendMessage(receiver.telegram_id, pmToReceiver)
    return ctx.reply(`🔼 Исходящий перевод.\n\n🔽 Получатель: ${receiver.username}\n🆔 Получателя: ${receiver.telegram_id}\n🔢 Сумма: ¤${ctx.args[2]}\nℹ️ Комиссия: ¤${fee}\n🆕 Ваш баланс: ¤${sender.money}
      `)
})

bot.hears('Мир', async (ctx) => {
    let world = await WorldModel.findByPk(1)
    return ctx.reply(`🔰 Баланс мира: ¤${spaces(world.balance)}\nℹ️ Стоимость материалов: ¤${spaces(world.matPrice)}
      `)
})

bot.hears('📞 Пригласить', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id);
    return ctx.reply(`
    ℹ️ Для приглашения друга по реферальной системе, отправьте ему ссылку-приглашение 
Как только он перейдет по ней и начнет игру, Вы получите ¤25.000.

Ваша ссылка: https://t.me/CampFireGameBot?start=${user.telegram_id}
      `)
})

bot.hears('📢 Вакансии', async (ctx) => {
    return await ctx.reply('Список работы', Markup
        .inlineKeyboard([
            [{
                text: `Дворник [1 уровень]`,
                callback_data: 'job_1'
            }, {
                text: `Промоутер [1 уровень]`,
                callback_data: 'job_2'
            }], [{
                text: `Официант [2 уровень]`,
                callback_data: 'job_3'
            }, {
                text: `Бармен [3 уровень]`,
                callback_data: 'job_4'
            }], [{
                text: `Кассир [4 уровень] `,
                callback_data: 'job_5'
            }, {
                text: `ПВЗ Дикие Ягоды [4 уровень]`,
                callback_data: 'job_6'
            }], [{
                text: `Слесарь [5 уровень]`,
                callback_data: 'job_7'
            }], [{
                text: `💤 Уволиться`,
                callback_data: 'job_leave'
            }]
        ])
        .resize()
    )
})

bot.action(/job_(1|2|3|4|5|6|7|leave)/, async (ctx) => {
    let data = ctx.update.callback_query.data;
    let user = await UserModel.findByPk(ctx.from.id);
    let job = null
    switch(data){
        case `job_1`:
            job = await JobModel.findByPk(1);
            if (user.level < job.level) {
                return await ctx.reply(`❕ У вас не хватает уровня для этой работы.`)
            }
            if (user.job == 0) {
                user.job = 1
                user.save()
                return await ctx.reply(`ℹ️ Вы устроились на работу дворником.\nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
            }
            return await ctx.reply(`❕ Вы уже устроены на другую работу`)
        case `job_2`:
            job = await JobModel.findByPk(2);
            if (user.level < job.level) {
                return await ctx.reply(`❕ У вас не хватает уровня для этой работы.`)
            }
            if (user.job == 0) {
                user.job = 2
                user.save()
                return await ctx.reply(`ℹ️ Вы устроились на работу промоутером. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
            }
            return await ctx.reply(`❕ Вы уже устроены на другую работу`)
        case `job_3`:
            job = await JobModel.findByPk(3);
            if (user.level < job.level) {
                return await ctx.reply(`❕ У вас не хватает уровня для этой работы.`)
            }
            if (user.job == 0) {
                user.job = 3
                user.save()
                return await ctx.reply(`ℹ️ Вы устроились на работу официантом. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
            }
            return await ctx.reply(`❕ Вы уже устроены на другую работу`)
        case `job_4`:
            job = await JobModel.findByPk(4);
            if (user.level < job.level) {
                return await ctx.reply(`❕ У вас не хватает уровня для этой работы.`)
            }
            if (user.job == 0) {
                user.job = 4
                user.save()
                return await ctx.reply(`ℹ️ Вы устроились на работу барменом. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
            }
            return await ctx.reply(`❕ Вы уже устроены на другую работу`)
        case `job_5`:
            job = await JobModel.findByPk(5);
            if (user.level < job.level) {
                return await ctx.reply(`❕ У вас не хватает уровня для этой работы.`)
            }
            if (user.job == 0) {
                user.job = 5
                user.save()
                return await ctx.reply(`❕ Вы устроились на работу кассиром. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
            }
            return await ctx.reply(`ℹ️ Вы уже устроены на другую работу`)
        case `job_6`:
            job = await JobModel.findByPk(6);
            if (user.level < job.level) {
                return await ctx.reply(`❕ У вас не хватает уровня для этой работы.`)
            }
            if (user.job == 0) {
                user.job = 6
                user.save()
                return await ctx.reply(`ℹ️ Вы устроились на работу в ПВЗ Дикие Ягоды. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
            }
            return await ctx.reply(`❕ Вы уже устроены на другую работу`)
        case `job_7`:
            job = await JobModel.findByPk(7);
            if (user.level < job.level) {
                return await ctx.reply(`❕ У вас не хватает уровня для этой работы.`)
            }
            if (user.job == 0) {
                user.job = 7
                user.save()
                return await ctx.reply(`ℹ️ Вы устроились на работу слесарем. \nВаш оклад: ¤${job.salary}\nПриступайте к работе командой "Работать"`)
            }
            return await ctx.reply(`❕ Вы уже устроены на другую работу`)
        case `job_leave`:
            if (user.job != 0) {
                user.job = 0
                user.save()
                return await ctx.reply(`ℹ️ Теперь вы безработный.`)
            }
            return await ctx.reply(`❕ Вы итак безработный.`)
    }
})

bot.hears('🏯 Казино', async (ctx) => {
    return await ctx.reply('🏯 Добро пожаловать в казино "杜明"\n', Markup
        .keyboard([
            ['🎰 Слоты'],
            ['▶️ Меню']
        ])
        .resize()
    )
})

bot.hears('🗄️ Работать', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id);
    let job = await JobModel.findByPk(user.job);
    let world = await WorldModel.findByPk(1)
    let timer = user.jobtime
    let cooldown = setCooldown(user, 3600, timer)
    if (user.jobtime > cooldown.currentTime) return ctx.reply(`📛 Работать можно будет через ${cooldown.timeLeftInMinutes} минут(у/ы)`);
    if (user.job == 0) {
        return await ctx.reply(`📛 Вы безработный.`)
    }
    user.jobtime = Number(cooldown.endTime)
    let jobExp = job.exp;
    user.jobcheck++
    switch (user.job) {
        case 1:
            if (user.jobcheck >= 4) {
                let paydayfee = job.salary / 100 * world.transactionfee
                let payday = job.salary - paydayfee
                world.balance -= payday
                user.money += payday
                giveExp(user, jobExp)
                user.jobcheck = 0
                user.save()
                world.save()
                return ctx.reply(`👔 Вы отработали смену дворника. \n🧾 Расчетный лист: \n⏳ Отработано часов: 4/4 \n💸 Оклад: ¤${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday}`)
            } else {
                user.save()
                return ctx.reply(`👔 Вы подмели дворы. \n⏳ Отработано часов: ${user.jobcheck}/4`)
            }
            break;
        case 2:
            if (user.jobcheck >= 2) {
                let paydayfee = job.salary / 100 * world.transactionfee
                let payday = job.salary - paydayfee
                world.balance -= payday
                user.money += payday
                giveExp(user, jobExp)
                user.jobcheck = 0
                user.save()
                world.save()
                return ctx.reply(`👔 Вы отработали смену промоутера. \n🧾 Расчетный лист: \n⏳ Отработано часов: 2/2 \n💸 Оклад: ¤${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday}`)
            } else {
                user.save()
                return ctx.reply(`👔 Вы раздавали листовки целый час. \n⏳ Отработано часов: ${user.jobcheck}/2`)
            }
            break;
        case 3:
            if (user.jobcheck >= 4) {
                let paydayfee = job.salary / 100 * world.transactionfee
                let payday = job.salary - paydayfee
                world.balance -= payday
                let tips = [50, 100, 200, 500, 1000].random()
                user.money += tips
                user.money += payday
                giveExp(user, jobExp)
                user.jobcheck = 0
                user.save()
                world.save()
                return ctx.reply(`👔 Вы отработали смену официанта. \n🧾 Расчетный лист: \n⏳ Отработано часов: 4/4 \n💸 Оклад: ¤${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday} \n💰 Получено чаевых: ¤${tips}`)
            } else {
                let tips = [50, 100, 200, 500, 1000].random()
                user.money += tips
                user.save()
                return ctx.reply(`👔 Вы целый час бегали и отрабатывали заказы. \n🧾 Получено чаевых: ¤${tips} \n⏳ Отработано часов: ${user.jobcheck}/4`)
            }
            break;
        case 4:
            if (user.jobcheck >= 5) {
                let paydayfee = job.salary / 100 * world.transactionfee
                let payday = job.salary - paydayfee
                world.balance -= payday
                let tips = [50, 100, 200, 300, 500, 1000, 2000].random()
                world.balance -= tips
                user.money += tips
                user.money += payday
                giveExp(user, jobExp)
                user.jobcheck = 0
                user.save()
                world.save()
                return ctx.reply(`👔 Вы отработали смену бармена. \n🧾 Расчетный лист: \n⏳ Отработано часов: 5/5 \n💸 Оклад: ¤${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday} \n💰 Получено чаевых: ¤${tips}`)
            } else {
                let tips = [50, 100, 200, 300, 500, 1000, 2000].random()
                world.balance -= tips
                user.money += tips
                user.save()
                world.save()
                return ctx.reply(`👔 Вы целый час стояли за стойкой и разливали пойло. \n🧾 Получено чаевых: ¤${tips} \n⏳ Отработано часов: ${user.jobcheck}/5`)
            }
            break;
        case 5:
            if (user.jobcheck >= 5) {
                let paydayfee = job.salary / 100 * world.transactionfee
                let payday = job.salary - paydayfee
                world.balance -= payday
                user.money += payday
                giveExp(user, jobExp)
                user.jobcheck = 0
                user.save()
                world.save()
                return ctx.reply(`👔 Вы отработали смену кассира. \n🧾 Расчетный лист: \n⏳ Отработано часов: 5/5 \n💸 Оклад: ¤${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday}`)
            } else {
                user.save()
                return ctx.reply(`👔 Вы целый час обслуживали покупателей и кричали: "Гаааляяя, отмена!". \n⏳ Отработано часов: ${user.jobcheck}/5`)
            }
            break;
        case 6:
            if (user.jobcheck >= 6) {
                let paydayfee = job.salary / 100 * world.transactionfee
                let payday = job.salary - paydayfee
                let stealed = [{
                    name: "Помада",
                    price: 200
                }, {
                    name: "Бюстгалтер",
                    price: 1300
                }, {
                    name: "Прокладки",
                    price: 250
                }, {
                    name: "Перцовый балончик",
                    price: 600
                }, {
                    name: "Гитара",
                    price: 6500
                }, {
                    name: "Комбик",
                    price: 9000
                }, {
                    name: "Кроссовки",
                    price: 2000
                }, {
                    name: "Шампунь",
                    price: 180
                }, {
                    name: "Смартфон Texno",
                    price: 6999
                }, {
                    name: "TWS Гарнитура",
                    price: 2800
                }, {
                    name: "Геймпад GameStation 5",
                    price: 1400
                }, {
                    name: "Дилдо",
                    price: 600
                }, {
                    name: "Вагиноимитатор",
                    price: 600
                }].random()
                world.balance -= payday
                world.balance -= Number(stealed.price)
                user.money += payday
                user.money += Number(stealed.price)
                giveExp(user, jobExp)
                user.jobcheck = 0
                user.save()
                world.save()
                return ctx.reply(`👔 Вы отработали смену в Диких Ягодах. \n🧾 Расчетный лист: \n⏳ Отработано часов: 6/6 \n💸 Оклад: ¤${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday} \n💰 Вы украли и продали со склада: ${stealed.name} (¤${stealed.price})`)
            } else {
                user.save()
                return ctx.reply(`👔 Вы целый час выдавали заказы в Диких Ягодах. \n⏳ Отработано часов: ${user.jobcheck}/6`)
            }
            break;
        case 7:
            if (user.jobcheck >= 6) {
                let paydayfee = job.salary / 100 * world.transactionfee
                let payday = job.salary - paydayfee
                world.balance -= payday
                user.money += payday
                giveExp(user, jobExp)
                user.jobcheck = 0
                user.save()
                world.save()
                return ctx.reply(`👔 Вы отработали смену слесарем. \n🧾 Расчетный лист: \n⏳ Отработано часов: 6/6 \n💸 Оклад: ¤${job.salary} \nℹ️ Подоходный налог: ${world.transactionfee}% \n💹 К выплате: ¤${payday}`)
            } else {
                user.save()
                return ctx.reply(`👔 Вы целый час работали на заводе, вы молодец! \n⏳ Отработано часов: ${user.jobcheck}/6`)
            }
            break;
    }
})

bot.hears('Топ', async (ctx) => {
    let topPlayer = await UserModel.findAll({
        attributes: ['username', [sequelize.fn('sum', sequelize.col('money')), 'money'], 'status'],
        group: ['username', 'status'],
        where: {
            telegram_id: {
                [Op.ne]: 275416286
            }
        },
        order: [
            [sequelize.literal('money'), 'DESC']
        ],
        limit: 10
    })
    let text = `🏆 Топ 10 игроков по балансу.\n\n`
    for(i=0; i<topPlayer.length; i++){
        text += `${topSym[i]}. ${topPlayer[i].status == 'bronze' ? `[🔺]` : ""}${topPlayer[i].status == 'silver' ? `[🔹]` : ""}${topPlayer[i].status == 'gold' ? `[🔸]` : ""} ${topPlayer[i].username} [¤${spaces(topPlayer[i].money)}]\n`
    }
    return await ctx.reply(text)

})

bot.hears('🔵 Имущество', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id);
    return await ctx.reply(`Выберите тип`, Markup
        .inlineKeyboard([
            [
            {text: 'Жилье', callback_data: `shop_house`}, 
            {text: 'Телефоны', callback_data: `shop_phone`}, 
            {text: 'Автосалон', callback_data: `shop_car`}
        ]
        ])
        .resize())
})

bot.action('shopmenu', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id);
    return await ctx.editMessageText(`Выберите тип`, Markup
        .inlineKeyboard([
            [
            {text: 'Жилье', callback_data: `shop_house`}, 
            {text: 'Телефоны', callback_data: `shop_phone`}, 
            {text: 'Автосалон', callback_data: `shop_car`}
        ]
        ])
        .resize())
})

bot.action(/shop_(house|phone|car)/, async (ctx) => {
    let data = ctx.update.callback_query.data;
    let prodArray = []
    let text = `Доступно к покупке:\n`
    switch(data){
        case `shop_house`:
            for (i in houses) {
                prodArray.push({text: i, callback_data: `{"action": "buy", "type": "house", "value": "${i}"}`})
                text += i + `. ${houses[i].name} (¤${houses[i].price})\n`
            }
        break;
        case `shop_phone`:
            for (i in phones) {
                prodArray.push({text: i, callback_data: `{"action": "buy", "type": "phone", "value": "${i}"}`})
                text += i + `. ${phones[i].name} (¤${phones[i].price})\n`
            }
        break;
        case `shop_car`:
            for (i in cars) {
                prodArray.push({text: i, callback_data: `{"action": "buy", "type": "car", "value": "${i}"}`})
                text += i + `. ${cars[i].name} (¤${cars[i].price})\n`
            }
        break;
    }
    prodArray.push({text: `Назад`, callback_data: `shopmenu`})
    let rows = []
    while (prodArray.length > 0) {
        rows.push(prodArray.splice(0, 5)) // разбиваем на подмассивы по 5 кнопок
    }
    return await ctx.editMessageText(text, Markup
        .inlineKeyboard(rows)
        .resize())
})

bot.action(/{"action": "buy"*/, async (ctx) => {
    let data = ctx.update.callback_query.data;
    data = JSON.parse(data)
    let user = await UserModel.findByPk(ctx.from.id)
    let property = await PropertyModel.findByPk(ctx.from.id);
    let world = await WorldModel.findByPk(1)
    if (data.type == "house") {
        if (user.money < houses[data.value].price) return await ctx.reply(`У вас недостаточно средств!`)
        if (property.house.name) return await ctx.reply(`У вас уже есть дом.`)
        user.money -= houses[data.value].price
        world.balance += houses[data.value].price
        property.house = houses[data.value]
        await user.save()
        await world.save()
        await property.save()
        return await ctx.reply(`Вы купили ${houses[data.value].name}`)
    }
    if (data.type == "car") {
        if (user.money < cars[data.value].price) return await ctx.reply(`У вас недостаточно средств!`)
        if (property.car.name) return await ctx.reply(`У вас уже есть автомобиль.`)
        if (!property.house.name) return await ctx.reply(`Для покупки автомобиля, у Вас должен быть дом.`)
          user.money -= cars[data.value].price
          world.balance += cars[data.value].price
          property.car = cars[data.value]
          await user.save()
          await world.save()
          await property.save()
          return await ctx.reply(`Вы купили ${cars[data.value].name}`)
      }
      if (data.type == "phone") {
        if (user.money < phones[data.value].price) return await ctx.reply(`У вас недостаточно средств!`)
        if (property.mobile.name) return await ctx.reply(`У вас уже есть телефон.`)
          user.money -= phones[data.value].price
          world.balance += phones[data.value].price
          property.mobile = phones[data.value]
          await user.save()
          await world.save()
          await property.save()
          return await ctx.reply(`Вы купили ${phones[data.value].name}`)
      }
      if (data.type == "equipment") {
        if (user.money < weaponshop[data.value].price) return await ctx.reply(`У вас недостаточно средств!`)
          if (data.type == weaponshop[data.value].type) {
              if (property.equipment.name) return await ctx.reply(`У вас уже есть экипировка.`)
              user.money -= weaponshop[data.value].price
              world.balance += weaponshop[data.value].price
              property.equipment = weaponshop[data.value]
              await user.save()
              await world.save()
              await property.save()
              return await ctx.reply(`Вы купили ${weaponshop[data.value].name}`)
          }
          if (property.weapon.name) return await ctx.reply(`У вас уже есть оружие.`)
          user.money -= weaponshop[data.value].price
          world.balance += weaponshop[data.value].price
          property.weapon = weaponshop[data.value]
          await user.save()
          await world.save()
          await property.save()
          return await ctx.reply(`Вы купили ${weaponshop[data.value].name}`)
      }
})

bot.hears('Поставщик', async (ctx) => {
    let text = `[Hatkeis Gunsmith](https://telegra.ph/Hatkeis-Gunsmith-09-27)`
    let shop = `\n  Вы подходите к зданию с вывеской "Ништяки Хаткейса".\n      Вот ассортимент на сегодня\n`
    for (i = 0; i < 10; i++) {
        shop += `${i}. ${weaponshop[i].name} (¤${spaces(weaponshop[i].price)})\n`
    }
    weaponShopUpdate()
    return await ctx.replyWithMarkdownV2(text + escape(shop), {disable_web_page_preview: true})
})

bot.command('sell', async (ctx) => {
    ctx.args = ctx.update.message.text.split(' ')
    let user = await UserModel.findByPk(ctx.from.id)
    let property = await PropertyModel.findByPk(ctx.from.id);
    let world = await WorldModel.findByPk(1)
    if (!ctx.args[1]) return ctx.reply(`Не указан аргумент.`)
    if (ctx.args[1] == "house") {
        if (!property.house.name) return await ctx.reply(`У вас нет дома.`)
        let name = property.house.name
        user.money += Math.round(property.house.price/2)
        world.balance -= Math.round(property.house.price/2)
        property.house = 0
        await user.save()
        await world.save()
        await property.save()
        return await ctx.reply(`Вы продали ${name}`)
    }
    if (ctx.args[1] == "car") {
        if (!property.car.name) return await ctx.reply(`У вас нет автомобиля.`)
        let name = property.car.name
        user.money += Math.round(property.car.price/2)
        world.balance -= Math.round(property.car.price/2)
        property.car = 0
        await user.save()
        await world.save()
        await property.save()
        return await ctx.reply(`Вы продали ${name}`)
    }
    if (ctx.args[1] == "phone") {
        if (!property.mobile.name) return await ctx.reply(`У вас нет телефона.`)
        let name = property.mobile.name
        user.money += Math.round(property.mobile.price/2)
        world.balance -= Math.round(property.mobile.price/2)
        property.mobile = 0
        await user.save()
        await world.save()
        await property.save()
        return await ctx.reply(`Вы продали ${name}`)
    }
    if (ctx.args[1] == "equipment") {
        if (!property.equipment.name) return await ctx.reply(`У вас нет экипировки.`)
        let name = property.equipment.name
        user.money += Math.round(property.equipment.price/2)
        world.balance -= Math.round(property.equipment.price/2)
        property.equipment = 0
        await user.save()
        await world.save()
        await property.save()
        return await ctx.reply(`Вы продали ${name}`)
    }
    if (ctx.args[1] == "weapon") {
        if (!property.weapon.name) return await ctx.reply(`У вас нет оружия.`)
        let name = property.weapon.name
        user.money += Math.round(property.weapon.price/2)
        world.balance -= Math.round(property.weapon.price/2)
        property.weapon = 0
        await user.save()
        await world.save()
        await property.save()
        return await ctx.reply(`Вы продали ${name}`)
    }
})

bot.hears('🌐 Организация', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    if (user.business.id == 0) return await ctx.reply(`Вы не состоите в организации.`)
    let business = await BusinessModel.findOne({
      where: {
        owner: ctx.from.id.toString()
      }
    })
    if(business === null){
      business = await BusinessModel.findOne({
        where: {
        owner: user.business.id
      }
    })
        return await ctx.replyWithMarkdownV2(`🏭 Организация\n_${business.name}_\n💹 Баланс: ¤${escape(spaces(business.balance))}\n🧰 Сырье: ${business.materials}\n👥 Рабочих: ${business.users.length}\n\nВаши отработки: ${user.business.checks}`, Markup.inlineKeyboard([
            [{
                text: `📶 Отработка`,
                callback_data: "workoff"
            }, {
                text: `⬅️ Покинуть`,
                callback_data: "покинуть"
            }]
        ])
        .oneTime()
        .resize())
    }
    if (business.owner == ctx.from.id){
        return await ctx.replyWithMarkdownV2(`🏭 Ваша организация\n_${business.name}_\n💹 Баланс: ¤${escape(spaces(business.balance))}\n🧰 Сырье: ${business.materials}\n👥 Рабочих: ${business.users.length}\n🔨 Отработок: ${business.checks}\n\nВаши отработки: ${user.business.checks}`, Markup.inlineKeyboard([
            [{
                text: `📶 Отработка`,
                callback_data: "workoff"
            }, {
                text: `💸 Payday`,
                callback_data: "payday"
            }]
        ])
        .oneTime()
        .resize())
    }
})

bot.action('workoff', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    let business = await BusinessModel.findOne({
      where: {
        owner: user.business.id.toString()
      }
    })
    if (user.business == null) return await ctx.reply(`Вы не работаете в организации.`)
    let timer = user.worktime
    let cooldown = setCooldown(user, 3600, timer)
    if (user.worktime > cooldown.currentTime) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `📛 Работа в организации будет доступна через ${cooldown.timeLeftInMinutes} минут(у/ы)`, {show_alert: true});
    if (business.materials < 10) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `📛 В организации недостаточно материалов для отработки.`);
    user.worktime = cooldown.endTime
    user.business = {
        id: user.business.id,
        checks: user.business.checks + 1,
        percent: user.business.percent
    }
    business.materials -= 10
    business.checks += 1
    await user.save()
    await business.save()
    if (business.owner == ctx.from.id){
        return await ctx.editMessageText(`🏭 Ваша организация\n_${business.name}_\n💹 Баланс: ¤${escape(spaces(business.balance))}\n🧰 Сырье: ${business.materials} \n👥 Рабочих: ${business.users.length}\n🔨 Отработок: ${business.checks}\n\nВаши отработки: ${user.business.checks}`,
        { 
            reply_markup: {
                inline_keyboard: [
                    [{
                        text: `📶 Отработка`,
                        callback_data: "workoff"
                    }, {
                        text: `💸 Payday`,
                        callback_data: "payday"
                    }]
                ]},
            parse_mode: `MarkdownV2`
        }
        )
    }else{
        return await ctx.editMessageText(`🏭 Организация\n_${business.name}_\n💹 Баланс: ¤${escape(spaces(business.balance))}\n🧰 Сырье: ${business.materials}\n👥 Рабочих: ${business.users.length}\n\nВаши отработки: ${user.business.checks}`,
        { 
            reply_markup: {
                inline_keyboard: [
                    [{
                        text: `📶 Отработка`,
                        callback_data: "workoff"
                    }, {
                        text: `⬅️ Покинуть`,
                        callback_data: "покинуть"
                    }]
                ]},
            parse_mode: `MarkdownV2`
        }
        ) 
    }
})

bot.action('покинуть', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    if (user.business.id == 0) return await ctx.reply(`Вы не состоите в организации.`)
    let business = await BusinessModel.findOne({
      where: {
        owner: ctx.from.id.toString()
      }
    })
    if(business === null){
      business = await BusinessModel.findOne({
        where: {
        owner: user.business.id
      }
    })
        await ctx.reply(`Подтвердите в личных сообщениях.`)
        return await bot.telegram.sendMessage(ctx.from.id, `🏭 Вы действительно хотите покинуть ${business.name}`, Markup.inlineKeyboard([
            [{
                text: `Да`,
                callback_data: "user_leave_business"
            }, {
                text: `Нет`,
                callback_data: "cancel"
            }]
        ])
        .oneTime()
        .resize()
        )
    }
    if (business.owner == ctx.from.id){
        return await ctx.reply(`Вы не можете покинуть свою организацию.`)
    }
})

bot.action('cancel', async (ctx) => {
    await ctx.deleteMessage()
    await bot.telegram.answerCbQuery(ctx.callbackQuery.id, `Отмена.`)
})

bot.action('user_leave_business', async (ctx) => {
    let data = ctx.update.callback_query.data;
    let user = await UserModel.findByPk(ctx.from.id)
    if (user.business.id == 0) return await ctx.reply(`Вы не состоите в организации.`)
    let business = await BusinessModel.findOne({
        where: {
        owner: user.business.id
      }
    })
    user.business = {
        id: 0,
        checks: 0,
        percent: 0
    }
    business.users = business.users.filter(value => value != ctx.from.id);
    business.save()
    user.save()
    return await bot.telegram.sendMessage(ctx.from.id, `🏭 Вы покинули ${business.name}`)
})

bot.action('payday', async (ctx) => {
    let user = null
    let business = await BusinessModel.findOne({
      where: {
        owner: ctx.from.id.toString()
      }
    })
    let world = await WorldModel.findByPk(1)
    if (business === null) return await ctx.reply(`У вас нет организации.`)
    if (business.checks < 12) return await ctx.reply(`Недостаточно отработок для формирования выплаты.`)
    let percentSum = 0
    let text = ``
    let percentErrorText = ``
    let profit = 0
    let piece = 0
    let moneyList = rand(1000, 3000)
    moneyList = moneyList*business.users.length
    for (i = 0; i < business.users.length; i++) { // Summary percent
        user = await UserModel.findByPk(business.users[i])
        percentSum += Number(user.business.percent)
        percentErrorText += `ℹ️ ${user.username} ${user.business.percent}% [/percent ${user.username} [проценты]]\n`
    }
    if (percentSum > 100) return await ctx.reply(`⚠️ Общий процент всех сотрудников превышает 100%\n    ➕ Остаток процентов перенесется в баланс организации.\n\n${percentErrorText}\n`)
    for (x = 0; x < business.users.length; x++) { // Общая внесенная сумма всеми участниками
        user = await UserModel.findByPk(business.users[x])
        profit += user.business.checks * moneyList * user.level
        text += `ℹ️ ${user.username} отработал ${user.business.checks} раз.\n`
        user.business = {
            id: user.business.id,
            checks: 0,
            percent: user.business.percent
        }
        user.save()
    }
    text += `   💹 Наработка за текущий период: ${profit}\n`
    let profitCheck = profit
    for (n = 0; n < business.users.length; n++) { // Процент выплаты участникам
        user = await UserModel.findByPk(business.users[n])
        piece = Math.round(profit / 100 * user.business.percent)
        profitCheck -= piece
        user.money += piece
        text += `➕ ${user.username} получает ¤${piece}\n`
        await bot.telegram.sendMessage(user.telegram_id, `ℹ️ Директор организации сформировал выплаты.\n➕ На ваш баланс поступило: ${spaces(piece)}`)
        giveExp(user, business.checks)
        user.save()
    }
    if (profitCheck > 0) {
        business.balance += profitCheck
        text += `➕ На баланс бизнеса поступило ¤${profitCheck}`
    }
    business.checks = 0
    business.save()
    console.log(`Payday: ${business.name}\n${text}`)
    return await ctx.reply(text)
})

bot.command('orgmessage', async (ctx) => {
    if (!ctx.args[1]) return ctx.reply(`Не указан аргумент.`)
    let business = await BusinessModel.findOne({
      where: {
        owner: ctx.from.id.toString()
      }
    })
    if (business === null) return await ctx.reply(`У вас нет организации.`)
    for (i = 0; i < business.users.length; i++) {
        user = await UserModel.findByPk(business.users[i])
        await bot.telegram.sendMessage(user.telegram_id, `Директор организации сообщает:\n ${ctx.payload}`)
    }
    console.log(`Директор организации сообщает:\n ${ctx.payload}`)
    return await ctx.reply(`Сообщение отправлено.`)
})

bot.command('materials', async (ctx) => {
    ctx.args = ctx.update.message.text.split(' ')
    let user = await UserModel.findByPk(ctx.from.id)
    if (user.business.id == 0) return await ctx.reply(`🚫 Вы не владеете организацией.`)
    let world = await WorldModel.findByPk(1)
    let business = await BusinessModel.findOne({
      where: {
        owner: ctx.from.id.toString()
      }
    })
    if (business === null) return await ctx.reply(`🚫 У вас нет организации.`)
    if (!ctx.args[1]) return ctx.reply(`🚫 Не указан аргумент.`)
    if (!Number(ctx.args[1])) return ctx.reply(`ℹ️ Количество должно быть числом.`)
    if (ctx.args[1] < 1) return ctx.reply(`ℹ️ Минимальное количество для покупки - 1`)
    if (ctx.args[1]*world.matPrice > business.balance) return ctx.reply(`🚫 Недостаточно средств на балансе организации.`)
    if (business.materials >= 700) return ctx.reply(`🚫 Склады полны.`)
    if (business.materials + Number(ctx.args[1]) > 700) return ctx.reply(`🚫 Нет столько места на складах.\n Можно закупить еще ${700 - business.materials}`)
    let count = Number(ctx.args[1])
    business.balance -= world.matPrice*count
    business.materials += count
    business.save()
    return await ctx.reply(`➕ Закуплено ${ctx.args[1]} материалов для организации на сумму ¤${world.matPrice*count}`)
})

bot.command('percent', async (ctx) => {
    ctx.args = ctx.update.message.text.split(' ')
    let user = await UserModel.findByPk(ctx.from.id)
    if (user.business.id == 0) return await ctx.reply(`Вы не владеете организацией.`)
    let business = await BusinessModel.findOne({
      where: {
        owner: ctx.from.id.toString()
      }
    })
    if (business === null) return await ctx.reply(`У вас нет организации.`)
    if (!ctx.args[1] || !ctx.args[2]) return ctx.reply(`Не указан аргумент.`)
    if (!Number(ctx.args[2])) return ctx.reply(`Процент должен быть числом от 1 до 100.`)
    if (ctx.args[2] < 1 || ctx.args[2] > 100) return ctx.reply(`Минимальный процент 1 | Максимальный процент 100.`)
    ctx.args[1] = ctx.args[1]
  console.log(ctx.args)
    let change = await UserModel.findOne({
      where: {
        username: ctx.args[1]
      }
    })
    if (change === null) return await ctx.reply(`Нет такого игрока.`)
    change.business = {
        id: change.business.id,
        checks: change.business.checks,
        percent: ctx.args[2]
    }
    change.save()
    return await ctx.reply(`Участнику ${change.username} установлен процент ${ctx.args[2]}`)
})

bot.command('business', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    if (user.business.id != 0){
    let business = await BusinessModel.findOne({
      where: {
        owner: ctx.from.id.toString()
      }
    })
  }
    let business = null
    let world = await WorldModel.findByPk(1)
    ctx.args = ctx.update.message.text.split(' ')
    if (business != null) return await ctx.reply(`У вас уже есть организация.`)
    if (!ctx.args[1]) return ctx.reply(`/business [Название организации]`)
    if (user.money < 100000) return await ctx.reply(`Регистрация организации стоит ¤100.000`)
    if (user.level < 5) return await ctx.reply(`Регистрация организации доступна с 5 уровня.`)
    user.money -= 100000
    world.balance += 100000
    let text = ``
    for (i = 1; i < ctx.args.length; i++) {
        text += `${ctx.args[i]} `
    }
    if (business === null) {
        BusinessModel.create({
            name: text,
            owner: user.telegram_id,
            balance: 50000,
            users: [user.telegram_id]
        })
        user.business = {
            id: user.telegram_id,
            checks: 0,
            percent: 100
        }
    } else {}
    user.save()
    world.save()
    return await ctx.reply(`Организация "${text}" успешно создана!\n Регистрация организации в реестре: ¤50.000 \n Капитал: ¤50.000`)
})

bot.command('invite', async (ctx) => {
    ctx.args = ctx.update.message.text.split(' ')
    if (!ctx.args[1]) return ctx.reply(`/invite [Nick]`)
    let user = await UserModel.findByPk(ctx.from.id)
    if (user.business.id == 0) return await ctx.reply(`🚫 У вас нет организации в которую можно пригласить игрока.`)
    let business = await BusinessModel.findOne({
        where: {
          owner: ctx.from.id.toString()
        }
      })
    if (business.users.length >= 5) return await ctx.reply(`📛 Достигнуто максимальное количество сотрудников в организации.`)
    let invited = await UserModel.findOne({
        where: {
            username: ctx.args[1]
        }
    });
    await bot.telegram.sendMessage(invited.telegram_id, '⤵️ Приглашение', Markup
        .inlineKeyboard([
            [{
                text: `Принять`,
                callback_data: `{"type": "business_invite_accept", "invitor": "${user.telegram_id}"}`
            }, {
                text: `Отклонить`,
                callback_data: `{"type": "business_invite_refuse", "invitor": "${user.telegram_id}"}`
            }]
        ]).oneTime())
    return await ctx.reply(`Приглашение отправлено.`)
})

bot.action(/{"type": "business_invite_(accept|refuse)"*/, async ctx => {
    let data = ctx.update.callback_query.data;
    data = JSON.parse(data)
    let user = await UserModel.findByPk(ctx.update.callback_query.from.id)
    if (data.type == 'business_invite_accept') {
      if(user.business.id == 0){
        let business = await BusinessModel.findOne({
          where: {
            owner: data.invitor
          }
        })
        user.business = {
            id: data.invitor,
            checks: 0,
            percent: 10
        }
        business.users = sequelize.fn('array_append', sequelize.col('users'), ctx.update.callback_query.from.id);
        business.save()
        user.save()
        await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `✔️ Приглашение принято.`, {show_alert: true})
      }
      await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `ℹ️ Вы уже в организации.`, {show_alert: true})
    } 
    if (data.type == 'business_invite_refuse'){
        await ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `❌ Приглашение отклонено.`, {show_alert: true})
    }
})

bot.command('report', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    ctx.args = ctx.update.message.text.split(' ')
    if (!ctx.args[1]) return ctx.reply(`/report [Текст обращения]`)
    let uID = shortid.generate()
    await ReportModel.create({
        uid: uID,
        author: user.telegram_id,
        text: ctx.payload,
        status: 1
    })
    let report = await ReportModel.findOne({
        where: {
            uid: uID
        }
    })
    await bot.telegram.sendMessage(adminList[0], `Обращение от пользователя ${user.username}\nТекст обращения:\n${ctx.payload}\n\nДля ответа /answer ${report.id} [Ответ]`)
    return await ctx.reply(`Обращение #${report.id}[${report.uid}] создано.`)
})

bot.hears('🎰 Слоты', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    ctx.args = ctx.update.message.text.split(' ')
    await ctx.reply('Комбинации слотов:\n7️⃣7️⃣7️⃣ - x25\n🍋🍋🍋 - x20\n🍇🍇🍇 - x15\n🔤🔤🔤 - x10', Markup
        .inlineKeyboard([
            [{
                text: `1000`,
                callback_data: `slots1000`
            }, {
                text: `5000`,
                callback_data: `slots5000`
            }, {
                text: `25000`,
                callback_data: `slots25000`
            }, {
                text: `50000`,
                callback_data: `slots50000`
            }, {
                text: `100000`,
                callback_data: `slots100000`
            }]
        ]))
})

bot.action(/slots(1000|5000|25000|50000|100000)/, async (ctx) => {
    let data = ctx.update.callback_query.data;
    let bet = 1000
    switch(data){
        case `slots1000`:
            bet = 1000
            break;
        case `slots5000`:
            bet = 5000
            break;
        case `slots25000`:
            bet = 25000
            break;
        case `slots50000`:
            bet = 50000
            break;
        case `slots100000`:
            bet = 100000
            break;
    }
    let user = await UserModel.findByPk(ctx.from.id)
    let timer = user.slottime
    let cooldown = setCooldown(user, 10, timer)
    if (user.slottime > cooldown.currentTime) return ctx.reply(`📛 Слоты будут доступны через пару секунд`);
    if (user.money < bet) return ctx.reply(`Недостаточно средств.`)
    user.slottime = cooldown.endTime
    let world = await WorldModel.findByPk(1)
    let result = await ctx.replyWithDice({emoji: `🎰`})
    let slot = slots[result.dice.value]
    let win = getSlot(result)
    console.log(user.username + `: Win: x` + win)
    user.money -= bet
    world.balance += bet
    if(win > 4){
        user.world -= bet*win
        user.money += bet*win
        user.save()
        world.save()
        return setTimeout(() => {
            ctx.reply(`➕ Вы выиграли ¤${spaces(bet*win)}`)
        }, 1700);
    }
    if(win > 0 && win <= 4){
        await giveExp(user, win*2)
        return setTimeout(() => {
            ctx.reply(`➕ Вы выиграли ${win*2} опыта.`)
        }, 1700);
    }
    if(win == 0){
        return setTimeout(() => {
            world.save()
            user.save()
            ctx.reply(`➖ Вы проиграли ¤${spaces(bet)}.`)
        }, 1700);
    }
    
})

bot.hears('Помощь', async (ctx) => {
    return await ctx.replyWithMarkdownV2(`• [Функционал](https://telegra.ph/CampFire-Bot-Info-09-25)\n• [Правила](https://telegra.ph/PRAVILA-BOTA-09-25)`, {
        disable_web_page_preview: true
    })
})

bot.command('promocode', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    ctx.args = ctx.update.message.text.split(' ')
    if (!ctx.args[1]) return ctx.reply(`/promocode [Code]`)
    let promocode = await PromocodeModel.findOne({
        where: {
          code: ctx.args[1]
        }
      })
    if(promocode === null) return await ctx.reply(`➖ Нет такого кода.`)
    if(promocode.users.length-1 >= promocode.activations && promocode.users != null) return await ctx.reply(`⚠️ Промокод уже активировали максимальное количество раз.`)
    if(promocode.users.includes(ctx.from.id.toString())) return await ctx.reply(`⚠️ Вы уже активировали этот промокод.`)
    console.log(promocode.users)
    promocode.users = sequelize.fn('array_append', sequelize.col('users'), ctx.from.id.toString());
    user.money += promocode.money
    user.save()
    promocode.save()
    await bot.telegram.sendMessage(adminList[0], `${user.username} активировал промокод.`)
    return await ctx.reply(`✅ Вы активировали промокод.`)
})

bot.hears('📦 Контейнеры', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    let containers = []
    let superWin = rarecars.random()
    let values = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    let oneValue = []
    for(i = 0; i < 10; i++){
        oneValue = values.random()
        values = values.filter(value => value != oneValue);
        containers.push({name: `📦 Контейнер ${i+1}`, value: oneValue})
    }
    let keyboardButtons = containers.map(container => {
        return {text: container.name, callback_data: `container_${container.value}`}
    })
    let rows = []
    while (keyboardButtons.length > 0) {
        rows.push(keyboardButtons.splice(0, 2)) // разбиваем на подмассивы по 5 кнопок
    }
    await ctx.replyWithMarkdownV2('[Sueta Logistic International](https://telegra.ph/OOO-Sueta-Logistic-International-09-27)\nДоступные контейнеры в порту:',
    {
            reply_markup: {
                inline_keyboard: rows
            },
            disable_web_page_preview: true
        })
})


bot.action(/container_(1|2|3|4|5|6|7|8|9|10)/, async (ctx) => {
    let data = ctx.update.callback_query.data;
    let user = await UserModel.findByPk(ctx.from.id)
    let property = await PropertyModel.findByPk(ctx.from.id)
    if(user.money < 500000) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Открытие контейнера стоит ¤500.000`, {show_alert: true})
    if(property.car.name) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `У вас уже есть автомобиль\nПродайте текущий автомобиль: /sell car`, {show_alert: true})
    user.money -= 500000
    let userWin = null
    switch(data){
        case `container_7`:
            userWin = rarecars.random()
            break;
        default:
            userWin = simplecars.random()
            break;
    }
    property.car = userWin
    user.save()
    property.save()
    ctx.deleteMessage()
    return await ctx.sendPhoto(userWin.image, { caption: `В контейнере была: ${userWin.name} стоимостью ¤${spaces(userWin.price)}`})
})

bot.action(/{"action": "sueta_*/, async (ctx) => {
    let data = ctx.update.callback_query.data;
    data = JSON.parse(data)
    console.log(data.car)
    let user = await UserModel.findByPk(ctx.from.id)
    let property = await PropertyModel.findByPk(ctx.from.id)
    switch(data.action){
        case `sueta_accept`:
            user.money += data.carprice
            await ctx.editMessageText(`➕ ${data.carprice}`)
            break;
        case `sueta_refuse`:
            user.money += Math.round(property.car.price/2)
            property.car = {
                name: data.carname,
                price: data.carprice
            }
            await ctx.editMessageText(`➕ ${data.carname}`)
            break;
    }
    user.save()
    property.save()
})
/////////////////////////////////////Admin Commands//////////////////////////////////////////////////


bot.command('answer', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    if(user.status != 'admin') return await ctx.reply(`Admin Only.`)
    ctx.args = ctx.update.message.text.split(' ')
    if (!ctx.args[1]) return ctx.reply(`Нужен номер обращения`)
    let report = await ReportModel.findByPk(ctx.args[1])
    if (report === null) return await ctx.reply(`Нет обращения с таким ID.`)
    if (report.status == 0) return await ctx.reply(`Данное обращение уже закрыто.`)
    let answer = ctx.args
    answer.shift()
    answer.shift()
    answer = answer.join(' ')
    await bot.telegram.sendMessage(report.author, `Ответ на обращение #${report.id}[${report.uid}]\n\n` + answer)
    report.status = 0
    report.save()
    return await ctx.reply(`Ответ отправлен, обращение закрыто!`)
})

bot.command('fastblock', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    if(!ctx.message.reply_to_message) return await ctx.reply(`Только на пересланное сообщение.`)
    let blocked = ctx.message.reply_to_message.from.id
    if(user.status != 'admin') return await ctx.reply(`Admin Only.`)
    await BlockModel.create({
        telegram_id: blocked,
        isBlocked: true,
        reason: `|AutoFastBlock|`,
        time: Math.trunc(Date.now() / 1000 + 3600)
    })
    await bot.telegram.sendMessage(blocked, `Вы были заблокированы администратором ${user.username}.`)
    return await ctx.reply(`Пользователь заблокирован.`)
})

bot.command('createpromocode', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    if(user.status != 'admin') return await ctx.reply(`Admin Only.`)
    ctx.args = ctx.update.message.text.split(' ')
    if (!ctx.args[1] || !ctx.args[2] || !ctx.args[3]) return ctx.reply(`/createpromo [activations] [money] [code]`)
    let promocode = await PromocodeModel.findOne({
        where: {
          code: ctx.args[3]
        }
      })
    if(promocode === null){
    await PromocodeModel.create({
        code: ctx.args[3],
        activations: ctx.args[1],
        money: ctx.args[2]
    })
    let voucherImage = await generateVoucher(ctx.args[3], ctx.args[1], ctx.args[2])
    return await ctx.sendPhoto({source: voucherImage, caption: `Создан промокод ${ctx.args[3]}` })
}
})

bot.command('genpromo', async (ctx) => {
    let user = await UserModel.findByPk(ctx.from.id)
    if(user.status != 'admin') return await ctx.reply(`Admin Only.`)
    ctx.args = ctx.update.message.text.split(' ')
    if (!ctx.args[1] || !ctx.args[2]) return ctx.reply(`/genpromo [activations] [money]`)
    let code = voucher_codes.generate({
        length: 6,
        count: 1,
        prefix: "CMP-",
        postfix: "-FIRE",
        charset: voucher_codes.charset("alphanumeric")
    });
    let promocode = await PromocodeModel.findOne({
        where: {
          code: code[0]
        }
      })
    if(promocode === null){
    await PromocodeModel.create({
        code: code[0],
        activations: ctx.args[1],
        money: ctx.args[2]
    })
    let voucherImage = await generateVoucher(code, ctx.args[1], ctx.args[2])
    return await ctx.sendPhoto({source: voucherImage, caption: `Создан промокод ${code[0]}` })
}
})

///////////////////////////////////////Functions//////////////////////////////////////////////////////

function rand(min, max) {
    return Math.round(Math.random() * (max - min)) + min
}
var parserInt = (str) => parseInt(str.replace(/k|к/ig, "000"));

function spaces(string) {
    if (typeof string !== "string") string = string.toString();
    return string.split("").reverse().join("").match(/[0-9]{1,3}/g).join(".").split("").reverse().join("");
};
function spacesWithMarkdown(string) {
    if (typeof string !== "string") string = string.toString();
    return string.split("").reverse().join("").match(/[0-9]{1,3}/g).join(".\\").split("").reverse().join("");
};
function escape(text) {
    text = text
   .replace(/\_/g, '\\_')
   .replace(/\*/g, '\\*')
   .replace(/\[/g, '\\[')
   .replace(/\]/g, '\\]')
   .replace(/\(/g, '\\(')
   .replace(/\)/g, '\\)')
   .replace(/\~/g, '\\~')
   .replace(/\`/g, '\\`')
   .replace(/\>/g, '\\>')
   .replace(/\#/g, '\\#')
   .replace(/\+/g, '\\+')
   .replace(/\-/g, '\\-')
   .replace(/\=/g, '\\=')
   .replace(/\|/g, '\\|')
   .replace(/\{/g, '\\{')
   .replace(/\}/g, '\\}')
   .replace(/\./g, '\\.')
   .replace(/\!/g, '\\!');
    return text
};
Array.prototype.random = function() {
    return this[Math.floor(this.length * Math.random())];
}

function getCurrentTime() {
  const now = new Date();
  const year = now.getFullYear();
  const month = now.getMonth() < 9 ? `0${now.getMonth() + 1}` : now.getMonth() + 1;
  const day = now.getDate() < 10 ? `0${now.getDate()}` : now.getDate();
  const hours = now.getHours() < 10 ? `0${now.getHours()}` : now.getHours();
  const minutes = now.getMinutes() < 10 ? `0${now.getMinutes()}` : now.getMinutes();
  const seconds = now.getSeconds() < 10 ? `0${now.getSeconds()}` : now.getSeconds();
  return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}`;
}

function getSlot(result) {
    switch(result.dice.value){
        case 1:
            return 10
        case 22:
            return 15
        case 43:
            return 20
        case 64:
            return 25
        case 17: case 33: case 49:
            return 1
        case 6: case 38: case 54:
            return 2
        case 11: case 27: case 59:
            return 3
        case 16: case 32: case 48:
            return 4
        default:
            return 0
}}

function setCooldown(user, seconds, type) {
    let cooldown = {}
    cooldown.currentTime = Math.trunc(Date.now() / 1000)

    switch(user.status){
        case `user`:
            cooldown.endTime = Math.trunc(Date.now() / 1000 + seconds) 
            break;
        case `bronze`:
            cooldown.endTime = Math.trunc(Date.now() / 1000 + (seconds/100*85))
            break;
        case `silver`:
            cooldown.endTime = Math.trunc(Date.now() / 1000 + (seconds/100*75))
            break;
        case `gold`:
            cooldown.endTime = Math.trunc(Date.now() / 1000 + (seconds/100*50))
            break;
        case `admin`:
            cooldown.endTime = Math.trunc(Date.now() / 1000)
            break;
    }
    cooldown.timeLeft = cooldown.endTime - cooldown.currentTime
    cooldown.timeLeftInMinutes = Math.ceil((type - cooldown.currentTime) / 60)
    return cooldown
}

async function giveExp(user, experience) {
    user.exp += experience
    for(i in expToUp){
        if (user.exp >= expToUp[user.level]) {
            user.exp -= expToUp[user.level]
            user.level += 1
            user.save()
            await bot.telegram.sendMessage(user.telegram_id, `⤴️ Ваш уровень повысился до ${user.level}!`)}
    }
    user.save()
}

function weaponShopUpdate() {
    let weaponId = []
    let equipId = []
    let drop = 1
    let counter = 5
    for (i = 0; i < 5; i++) {
        drop = weaponId.push(rand(1, 10))
    }
    for (i = 0; i < 5; i++) {
        drop = equipId.push(rand(1, 10))
    }
    for (i = 0; i < 5; i++) {
        weaponshop[i] = weapons[weaponId[i]]
    }
    for (i = 0; i < 5; i++) {
        weaponshop[counter] = equipment[equipId[i]]
        counter++
    }
    fs.writeFileSync('json/weaponshop.json', JSON.stringify(weaponshop, null, "\t"))
}

async function matPriceUpdate() {
  let world = await WorldModel.findByPk(1)
  let price = rand(35, 170)
  world.matPrice = price
  world.save()
}

setTimeout(() => {
    generatePromo()
}, 360000*3);

setInterval(() => {
    var today = new Date();
    let hours = today.getHours();
    if (hours == "0" || hours == "12") {
        weaponShopUpdate()
        matPriceUpdate()
    }
}, 360000);

async function generatePromo() {
    let activs = rand(1, 3)
    let give = rand(1000, 10000)
    let code = voucher_codes.generate({
        length: 6,
        count: 1,
        prefix: "CMP-",
        postfix: "-FIRE",
        charset: voucher_codes.charset("alphanumeric")
    });
    let promocode = await PromocodeModel.findOne({
        where: {
          code: code[0]
        }
      })
    if(promocode === null){
    await PromocodeModel.create({
        code: code[0],
        activations: activs,
        money: give
    })
    let voucherImage = await generateVoucher(code[0], activs, give)
    return await bot.telegram.sendPhoto(mainChat, {source: voucherImage})
}
}

async function generateVoucher(code, activations, money) {
    // загружаем изображение фона
    const background = await loadImage('./media/imageDefault3.png');
    
    // создаем новый canvas
    const canvas = createCanvas(background.width, background.height);
    const ctx = canvas.getContext('2d');
    
    // рисуем фоновое изображение
    ctx.drawImage(background, 0, 0);
    
    // выводим текст на картинку
    ctx.font = 'bold 30px Srbija Sans';
    ctx.fillStyle = '#232323';
    ctx.textAlign = 'center';
    ctx.fillText(`${code}`, canvas.width/2, canvas.height/1.90);
    
    // сохраняем картинку в файл
    const out = fs.createWriteStream('./media/image.png');
    const stream = canvas.createPNGStream();
    stream.pipe(out);
    
    // возвращаем путь к сгенерированной картинке
    return './media/image.png';
  }

start()

bot.launch()