import logging
import sqlite3
from aiogram import Router, F
from aiogram.types import CallbackQuery, Message, InlineKeyboardMarkup, InlineKeyboardButton
from db import get_user_language, get_language_text, get_button_text, DATA_DB

logger = logging.getLogger(__name__)

router = Router(name="jobs")

# Callback данные
BACK_CB = "menu:button9"
JOBS_CB_PREFIX = "job:"
JOBS_BACK_CB = "jobs_back"

def get_button9_text(lang: str) -> str:
    """Получает текст кнопки назад"""
    label = "⬅️ Назад"
    try:
        from db import MENU_DB
        conn = sqlite3.connect(MENU_DB)
        cur = conn.cursor()
        cur.execute("SELECT button9 FROM language WHERE name = ?", (lang,))
        row = cur.fetchone()
        conn.close()
        if row and row[0] and str(row[0]).strip():
            label = str(row[0]).strip()
    except Exception as e:
        logger.error(f"get_button9_text error for lang={lang}: {e}")
    return label

def get_user_language_from_db(user_id: int) -> str:
    """Получает язык пользователя из data.db"""
    try:
        conn = sqlite3.connect(DATA_DB)
        cur = conn.cursor()
        cur.execute("SELECT user_language FROM users WHERE user_id = ?", (user_id,))
        row = cur.fetchone()
        conn.close()
        if row and row[0]:
            return str(row[0]).strip()
        return "ru"  # язык по умолчанию
    except Exception as e:
        logger.error(f"Error getting user language for {user_id}: {e}")
        return "ru"  # язык по умолчанию

def build_back_keyboard(lang: str) -> InlineKeyboardMarkup:
    """Создает клавиатуру с кнопкой назад"""
    return InlineKeyboardMarkup(
        inline_keyboard=[[InlineKeyboardButton(text=get_button9_text(lang), callback_data=BACK_CB)]]
    )

def build_jobs_back_keyboard(lang: str) -> InlineKeyboardMarkup:
    """Создает клавиатуру для возврата к списку вакансий"""
    return InlineKeyboardMarkup(
        inline_keyboard=[[InlineKeyboardButton(text=get_button9_text(lang), callback_data=JOBS_BACK_CB)]]
    )

def get_jobs_by_language(language: str) -> list:
    """Получает вакансии для определенного языка из jobs.db"""
    try:
        conn = sqlite3.connect('jobs.db')
        cur = conn.cursor()
        # Получаем вакансии только для указанного языка
        cur.execute("SELECT name_jobs, text_jobs FROM jobs WHERE language = ?", (language,))
        jobs = cur.fetchall()
        conn.close()
        return jobs
    except Exception as e:
        logger.error(f"Error getting jobs for language {language}: {e}")
        return []

def get_job_details(job_name: str, language: str) -> dict:
    """Получает детали вакансии по названию и языку"""
    try:
        conn = sqlite3.connect('jobs.db')
        cur = conn.cursor()
        cur.execute("SELECT name_jobs, text_jobs FROM jobs WHERE name_jobs = ? AND language = ?", (job_name, language))
        row = cur.fetchone()
        conn.close()
        if row:
            return {
                'name': row[0],
                'description': row[1]
            }
        return None
    except Exception as e:
        logger.error(f"Error getting job details for {job_name} in {language}: {e}")
        return None

def build_jobs_keyboard(lang: str, jobs: list) -> InlineKeyboardMarkup:
    """Создает клавиатуру со списком вакансий"""
    keyboard_rows = []
    
    for job in jobs:
        job_name = job[0]  # name_jobs находится в первом элементе кортежа
        keyboard_rows.append([
            InlineKeyboardButton(text=job_name, callback_data=f"{JOBS_CB_PREFIX}{job_name}")
        ])
    
    # Добавляем кнопку назад в конец
    keyboard_rows.append([
        InlineKeyboardButton(text=get_button9_text(lang), callback_data=BACK_CB)
    ])
    
    return InlineKeyboardMarkup(inline_keyboard=keyboard_rows)

@router.callback_query(F.data == "menu:button5")
async def open_jobs(cb: CallbackQuery):
    """
    Открывает список вакансий (button5) с фильтрацией по языку пользователя
    """
    user_id = cb.from_user.id
    
    # Получаем язык пользователя из data.db
    user_language = get_user_language_from_db(user_id)
    
    try:
        await cb.message.delete()
    except Exception:
        pass
    
    # Получаем вакансии только для языка пользователя
    jobs = get_jobs_by_language(user_language)
    
    if not jobs:
        # Если нет вакансий для этого языка
        no_jobs_text = get_language_text(user_language, "text31") or "На данный момент вакансий нет"
        await cb.message.answer(no_jobs_text, reply_markup=build_back_keyboard(user_language))
        await cb.answer()
        return
    
    # Получаем текст заголовка из text31
    text31 = get_language_text(user_language, "text31") or "Доступные вакансии:"
    
    # Создаем клавиатуру с вакансиями
    keyboard = build_jobs_keyboard(user_language, jobs)
    
    # Отправляем сообщение с вакансиями
    await cb.message.answer(text31, reply_markup=keyboard)
    await cb.answer()

@router.callback_query(F.data == JOBS_BACK_CB)
async def back_to_jobs_list(cb: CallbackQuery):
    """
    Возвращает к списку вакансий с фильтрацией по языку пользователя
    """
    user_id = cb.from_user.id
    
    # Получаем язык пользователя из data.db
    user_language = get_user_language_from_db(user_id)
    
    try:
        await cb.message.delete()
    except Exception:
        pass
    
    # Получаем вакансии только для языка пользователя
    jobs = get_jobs_by_language(user_language)
    
    if not jobs:
        # Если нет вакансий для этого языка
        no_jobs_text = get_language_text(user_language, "text31") or "На данный момент вакансий нет"
        await cb.message.answer(no_jobs_text, reply_markup=build_back_keyboard(user_language))
        await cb.answer()
        return
    
    # Получаем текст заголовка из text31
    text31 = get_language_text(user_language, "text31") or "Доступные вакансии:"
    
    # Создаем клавиатуру с вакансиями
    keyboard = build_jobs_keyboard(user_language, jobs)
    
    # Отправляем сообщение с вакансиями
    await cb.message.answer(text31, reply_markup=keyboard)
    await cb.answer()

@router.callback_query(F.data.startswith(JOBS_CB_PREFIX))
async def show_job_details(cb: CallbackQuery):
    """
    Показывает детали вакансии с проверкой языка пользователя
    """
    user_id = cb.from_user.id
    
    # Получаем язык пользователя из data.db
    user_language = get_user_language_from_db(user_id)
    
    # Получаем название вакансии из callback_data
    job_name = cb.data[len(JOBS_CB_PREFIX):]
    
    # Получаем детали вакансии с проверкой языка
    job = get_job_details(job_name, user_language)
    
    if not job:
        await cb.answer("Вакансия не найдена", show_alert=True)
        return
    
    try:
        await cb.message.delete()
    except Exception:
        pass
    
    # Формируем сообщение с деталями вакансии
    message_text = f"💼 {job['name']}\n\n{job['description']}"
    
    # Создаем клавиатуру для возврата к списку вакансий
    keyboard = build_jobs_back_keyboard(user_language)
    
    # Отправляем сообщение с деталями вакансии
    await cb.message.answer(message_text, reply_markup=keyboard)
    await cb.answer()