import os
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils import executor
from aiogram.dispatcher.filters import Text
from database import create_tables
from logger import log_action
from dotenv import load_dotenv

# Загрузка переменных окружения из .env файла
load_dotenv()

API_TOKEN = os.getenv('BOT_API_TOKEN')
OPERATORS_GROUP_ID = os.getenv('OPERATORS_GROUP_ID')
ADMIN_GROUP_ID = os.getenv('ADMIN_GROUP_ID')

logging.basicConfig(level=logging.INFO)

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
dp.middleware.setup(LoggingMiddleware())

# Inline клавиатуры
def main_menu_keyboard():
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton('Учетные данные', callback_data='account_data'))
    keyboard.add(InlineKeyboardButton('Сделать заказ', callback_data='make_order'))
    keyboard.add(InlineKeyboardButton('История заказов', callback_data='order_history'))
    keyboard.add(InlineKeyboardButton('Заказать звонок', callback_data='request_call'))
    keyboard.add(InlineKeyboardButton('Начать разговор с оператором', callback_data='talk_operator'))
    return keyboard

def account_data_keyboard():
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton('Изменить ФИО', callback_data='change_name'))
    keyboard.add(InlineKeyboardButton('Изменить номер телефона', callback_data='change_phone'))
    keyboard.add(InlineKeyboardButton('Добавить адрес', callback_data='add_address'))
    keyboard.add(InlineKeyboardButton('Удалить адрес', callback_data='delete_address'))
    keyboard.add(InlineKeyboardButton('Поделиться контактом', callback_data='share_contact'))
    keyboard.add(InlineKeyboardButton('Назад', callback_data='back_to_main'))
    return keyboard

def order_keyboard():
    keyboard = InlineKeyboardMarkup()
    keyboard.add(InlineKeyboardButton('Добавить учетные данные', callback_data='add_account_data'))
    keyboard.add(InlineKeyboardButton('Выбрать адрес', callback_data='select_address'))
    keyboard.add(InlineKeyboardButton('Выбрать время для уборки', callback_data='select_time'))
    keyboard.add(InlineKeyboardButton('Выбрать тип уборки', callback_data='select_cleaning_type'))
    keyboard.add(InlineKeyboardButton('Выбрать способ оплаты', callback_data='select_payment_method'))
    keyboard.add(InlineKeyboardButton('Подтвердить заказ', callback_data='confirm_order'))
    keyboard.add(InlineKeyboardButton('Назад', callback_data='back_to_main'))
    return keyboard

# Обработчики команд
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    await message.answer("Добро пожаловать в BOTKlining!", reply_markup=main_menu_keyboard())
    log_action(message.from_user.id, 'start')

@dp.callback_query_handler(lambda c: c.data == 'account_data')
async def process_account_data(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.from_user.id, "Учетные данные:", reply_markup=account_data_keyboard())
    log_action(callback_query.from_user.id, 'account_data')

@dp.callback_query_handler(lambda c: c.data == 'make_order')
async def process_make_order(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.from_user.id, "Сделать заказ:", reply_markup=order_keyboard())
    log_action(callback_query.from_user.id, 'make_order')

@dp.callback_query_handler(lambda c: c.data == 'order_history')
async def process_order_history(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    # Добавьте логику для просмотра истории заказов
    await bot.send_message(callback_query.from_user.id, "История заказов:")
    log_action(callback_query.from_user.id, 'order_history')

@dp.callback_query_handler(lambda c: c.data == 'request_call')
async def process_request_call(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    # Добавьте логику для заказа звонка
    await bot.send_message(callback_query.from_user.id, "Заказ звонка оформлен. Ожидайте звонок в течение 30 минут.")
    log_action(callback_query.from_user.id, 'request_call')

@dp.callback_query_handler(lambda c: c.data == 'talk_operator')
async def process_talk_operator(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    # Добавьте логику для начала разговора с оператором
    await bot.send_message(callback_query.from_user.id, "Разговор с оператором начат.")
    log_action(callback_query.from_user.id, 'talk_operator')

@dp.callback_query_handler(lambda c: c.data == 'back_to_main')
async def process_back_to_main(callback_query: types.CallbackQuery):
    await bot.answer_callback_query(callback_query.id)
    await bot.send_message(callback_query.from_user.id, "Главное меню:", reply_markup=main_menu_keyboard())
    log_action(callback_query.from_user.id, 'back_to_main')

if __name__ == '__main__':
    create_tables()
    executor.start_polling(dp, skip_updates=True)
