# /opt/trueconf_bot/lk/documents_service.py
import smtplib
import logging
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from datetime import datetime

import config.config as config

logger = logging.getLogger(__name__)

def get_user_info_for_docs(cursor, card_id: str) -> dict:
    """Извлекает кадровые данные сотрудника по CARD_ID для оформления бланков справок"""
    current_date = datetime.now().strftime('%Y-%m-%d')
    
    query = """
        select e.TAB_N, a.NAME, d.NAME, hr.FULL_NAME, hr.EMAIL, f.SNAME, pr.EMAIL as workBookEmail
        from (select e.TAB_N, e.FIRM_ID, c.F_NAME, c.L_NAME, e.ID, c.M_NAME
              from UOV_SELFSERVICE_PR_EMP e
              join UOV_SELFSERVICE_PR_CARD c on c.ID=e.CARD_ID
              where c.ID = %s
              group by e.ID, e.FIRM_ID, c.F_NAME, c.L_NAME, c.M_NAME, e.TAB_N ) as e
        join UOV_SELFSERVICE_PR_TRANS t on t.EMP_ID = e.ID
        join UOV_SELFSERVICE_ST_APPOINT a on a.ID = t.APPOINT_ID
        join UOV_SELFSERVICE_HR_DEPT d on d.ID = t.DEPT_ID
        join UOV_SELFSERVICE_HR_S_USER_SL hr on hr.FIRM_ID = e.FIRM_ID
        join UOV_SELFSERVICE_HR_FIRM f on e.FIRM_ID=f.ID
        left join UOV_SELFSERVICE_HR_S_USER_PR pr on (pr.DEPT_ISOL_ID = d.DEPT_ISOL_ID or pr.FIRM_ID = f.ID)
        where ((t.D_FROM <= %s and t.D_TO >= %s)
               or (t.D_FROM <= %s and t.D_TO = '1999-12-31'))
        and e.FIRM_ID = f.ID
    """
    cursor.execute(query, (card_id, current_date, current_date, current_date))
    row = cursor.fetchone()
    
    if not row:
        raise Exception("Не удалось найти кадровые данные сотрудника для заказа справки.")
        
    return {
        'tab_n': str(row[0]) if row[0] else "Не указан",
        'job': str(row[1]) if row[1] else "",
        'dept': str(row[2]) if row[2] else "",
        'hr_fio': str(row[3]) if row[3] else "",
        'hr_email': str(row[4]) if row[4] else "",
        'firm': str(row[5]) if row[5] else "",
        'wb_email': str(row[6]) if row[6] else ""
    }

def generate_mail_message(doc_name: str, quantity: int, user_info: dict, period: str = "", attachment_path: str = "") -> bool:
    """Формирует и отправляет HTML-письмо заявки на справку в отдел кадров СибЦема"""
    
    # Извлекаем оригинальные адреса кадровиков из структуры БД
    orig_to = user_info.get('hr_email', '').strip()
    # Копия уходит на ящик трудовых книжек только если заказывают пункт 7
    orig_cc = user_info.get('wb_email', '').strip() if doc_name == "Копия трудовой книжки" else ""
    
    to_email = orig_to
    cc_list = [orig_cc] if orig_cc else []
    
    # Если включен DOCUMENTS_TEST_MODE, жестко перехватываем поток писем
    if getattr(config, 'DOCUMENTS_TEST_MODE', False):
        test_email = getattr(config, 'DOCUMENTS_TARGET_EMAIL', 'mailonline@sibcem.ru')
        to_email = test_email
        cc_list = []

    subject = f"Запрос документа {doc_name} из Личного кабинета"
    period_str = f" {period}" if period else ""
    
    messageBody = (
        f"Необходимо оформить документ {doc_name} в количестве {quantity} шт. "
        f"на сотрудника предприятия {user_info['firm']} с табельным номером - "
        f"\"{user_info['tab_n']}\"{period_str}.<br/><br/>"
        f"Данное письмо отправлено автоматически, отвечать на него не стоит."
    )
    
    message = MIMEMultipart()
    message['From'] = getattr(config, 'DEFAULT_EMAIL_FROM', 'mailonline@sibcem.ru')
    message['To'] = to_email
    message['Subject'] = subject
    
    if cc_list:
        message['Cc'] = ", ".join(cc_list)
        
    message.attach(MIMEText(messageBody, 'html', 'utf-8'))
    
    if attachment_path:
        try:
            with open(attachment_path, 'rb') as attachment:
                part = MIMEBase("application", "octet-stream")
                part.set_payload(attachment.read())
                encoders.encode_base64(part)
                part.add_header("Content-Disposition", f"attachment; filename={attachment_path}")
                message.attach(part)
        except Exception as e:
            logger.error(f"Не удалось прикрепить файл к письму: {e}")
            
    recipients = [to_email] + cc_list
    smtp_server = getattr(config, 'SMTP_SERVER', 'srvkem-mail.sibcem.ru')
    smtp_port = int(getattr(config, 'SMTP_PORT', 25))
    
    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()
        # Если в конфигурации Passwork лежат логин/пароль для SMTP — авторизуемся
        if getattr(config, 'SMTP_USER', None):
            server.login(config.SMTP_USER, config.SMTP_PASSWORD)
            
        server.sendmail(message['From'], recipients, message.as_string())
        server.quit()
        return True
    except Exception as e:
        logger.error(f"Ошибка SMTP при отправке письма: {e}")
        return False