from __future__ import annotations

import sqlite3
import traceback

ERROR_MESSAGES = {
    'LOGIN_REQUIRED': ('Session \u0627\u06cc\u0646\u0633\u062a\u0627\u06af\u0631\u0627\u0645 \u0645\u0646\u0642\u0636\u06cc \u0634\u062f\u0647 \u0648 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0648\u0631\u0648\u062f \u0645\u062c\u062f\u062f \u062f\u0627\u0631\u062f.', '\u0627\u0632 \u0628\u062e\u0634 \u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0646\u0633\u062a\u0627\u06af\u0631\u0627\u0645 \u062f\u0648\u0628\u0627\u0631\u0647 \u0648\u0627\u0631\u062f \u0634\u0648\u06cc\u062f.'),
    'CHALLENGE_REQUIRED': ('\u0627\u06cc\u0646\u0633\u062a\u0627\u06af\u0631\u0627\u0645 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u062a\u0623\u06cc\u06cc\u062f \u0627\u0636\u0627\u0641\u06cc \u062f\u0627\u0631\u062f.', '\u06a9\u062f \u062a\u0623\u06cc\u06cc\u062f \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f \u06cc\u0627 \u062a\u0623\u06cc\u06cc\u062f \u062f\u0633\u062a\u06cc \u0631\u0627 \u062f\u0627\u062e\u0644 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f.'),
    'TWO_FACTOR_REQUIRED': ('\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u062f\u0648 \u0645\u0631\u062d\u0644\u0647\u200c\u0627\u06cc \u0627\u06cc\u0646\u0633\u062a\u0627\u06af\u0631\u0627\u0645 \u0644\u0627\u0632\u0645 \u0627\u0633\u062a.', '\u06a9\u062f \u0641\u0639\u0644\u06cc 2FA \u0631\u0627 \u062f\u0631 \u0635\u0641\u062d\u0647 \u0627\u062a\u0635\u0627\u0644 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f.'),
    'RATE_LIMIT': ('\u0627\u06cc\u0646\u0633\u062a\u0627\u06af\u0631\u0627\u0645 \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u200c\u0647\u0627\u06cc \u0627\u06cc\u0646 \u0627\u06a9\u0627\u0646\u062a \u0631\u0627 \u0645\u0648\u0642\u062a\u0627\u064b \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a.', '\u0627\u0631\u0633\u0627\u0644 \u0645\u062a\u0648\u0642\u0641 \u0645\u06cc\u200c\u0634\u0648\u062f\u061b \u0628\u0639\u062f\u0627\u064b \u0648 \u0628\u0627 \u0641\u0627\u0635\u0644\u0647 \u0628\u06cc\u0634\u062a\u0631 \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.'),
    'NETWORK_ERROR': ('\u0627\u0631\u062a\u0628\u0627\u0637 \u0634\u0628\u06a9\u0647 \u0628\u0627 \u0627\u06cc\u0646\u0633\u062a\u0627\u06af\u0631\u0627\u0645 \u0628\u0631\u0642\u0631\u0627\u0631 \u0646\u0634\u062f.', '\u062f\u0633\u062a\u0631\u0633\u06cc \u0627\u06cc\u0646\u062a\u0631\u0646\u062a \u062e\u0631\u0648\u062c\u06cc \u0647\u0627\u0633\u062a \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u0628\u0639\u062f\u0627\u064b \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u062f.'),
    'TIMEOUT': ('\u0632\u0645\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u06cc\u0646\u0633\u062a\u0627\u06af\u0631\u0627\u0645 \u062a\u0645\u0627\u0645 \u0634\u062f.', '\u0628\u0639\u062f\u0627\u064b \u062f\u0648\u0628\u0627\u0631\u0647 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u062f\u061b Retry \u0633\u0631\u06cc\u0639 \u0627\u0646\u062c\u0627\u0645 \u0646\u062f\u0647\u06cc\u062f.'),
    'DATABASE_ERROR': ('\u0639\u0645\u0644\u06cc\u0627\u062a \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 SQLite \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062f.', 'SQLite Integrity Check \u0648 Permission \u067e\u0648\u0634\u0647 storage \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.'),
    'PERMISSION_ERROR': ('\u06cc\u06a9\u06cc \u0627\u0632 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u0645\u0648\u0631\u062f\u0646\u06cc\u0627\u0632 \u0642\u0627\u0628\u0644 \u0646\u0648\u0634\u062a\u0646 \u0646\u06cc\u0633\u062a.', 'Permission \u067e\u0648\u0634\u0647\u200c\u0647\u0627\u06cc storage \u0648 uploads \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.'),
    'MEDIA_UPLOAD_ERROR': ('\u0641\u0627\u06cc\u0644 \u0631\u0633\u0627\u0646\u0647\u200c\u0627\u06cc \u0622\u0645\u0627\u062f\u0647 \u06cc\u0627 \u0627\u0631\u0633\u0627\u0644 \u0646\u0634\u062f.', '\u0646\u0648\u0639 \u0641\u0627\u06cc\u0644\u060c \u062d\u062c\u0645 \u0648 Codec \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.'),
    'COMMENT_SEND_ERROR': ('\u067e\u0627\u0633\u062e \u06a9\u0627\u0645\u0646\u062a \u0627\u0631\u0633\u0627\u0644 \u0646\u0634\u062f.', 'Session \u0648 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc \u0627\u06cc\u0646\u0633\u062a\u0627\u06af\u0631\u0627\u0645 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.'),
    'DM_SEND_ERROR': ('\u067e\u06cc\u0627\u0645 \u062f\u0627\u06cc\u0631\u06a9\u062a \u0627\u0631\u0633\u0627\u0644 \u0646\u0634\u062f.', 'Session \u0648 \u0627\u0645\u06a9\u0627\u0646 \u062f\u0631\u06cc\u0627\u0641\u062a \u067e\u06cc\u0627\u0645 \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.'),
    'FOLLOW_CHECK_ERROR': ('\u0648\u0636\u0639\u06cc\u062a Follow \u0642\u0627\u0628\u0644 \u062a\u0634\u062e\u06cc\u0635 \u0646\u0628\u0648\u062f.', '\u06a9\u0645\u06cc \u0628\u0639\u062f \u062f\u0648\u0628\u0627\u0631\u0647 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f\u061b \u0646\u062a\u06cc\u062c\u0647 Unknown \u0628\u0627\u0642\u06cc \u0645\u06cc\u200c\u0645\u0627\u0646\u062f.'),
    'SESSION_ERROR': ('Session \u0627\u06cc\u0646\u0633\u062a\u0627\u06af\u0631\u0627\u0645 Load \u0646\u0634\u062f.', '\u0627\u0632 \u0628\u062e\u0634 \u0627\u062a\u0635\u0627\u0644 \u0627\u06cc\u0646\u0633\u062a\u0627\u06af\u0631\u0627\u0645 \u062f\u0648\u0628\u0627\u0631\u0647 Login \u06a9\u0646\u06cc\u062f.'),
    'CRON_ERROR': ('Worker \u0637\u0628\u0642 \u0632\u0645\u0627\u0646\u200c\u0628\u0646\u062f\u06cc Cron \u0627\u062c\u0631\u0627 \u0646\u0634\u062f\u0647 \u0627\u0633\u062a.', '\u062f\u0633\u062a\u0648\u0631 Cron \u062f\u0631 cPanel \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.'),
    'WORKER_LOCK_ERROR': ('Worker Lock \u0642\u0627\u0628\u0644 \u062f\u0631\u06cc\u0627\u0641\u062a \u0646\u06cc\u0633\u062a.', '\u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f Worker \u062f\u06cc\u06af\u0631\u06cc \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627\u0633\u062a \u06cc\u0627 Lock \u0642\u062f\u06cc\u0645\u06cc \u0645\u0627\u0646\u062f\u0647 \u0627\u0633\u062a.'),
    'UNKNOWN_ERROR': ('\u06cc\u06a9 \u062e\u0637\u0627\u06cc \u067e\u06cc\u0634\u200c\u0628\u06cc\u0646\u06cc\u200c\u0646\u0634\u062f\u0647 \u0631\u062e \u062f\u0627\u062f.', '\u062c\u0632\u0626\u06cc\u0627\u062a Debug \u0648 \u0622\u062e\u0631\u06cc\u0646 Log\u0647\u0627 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.'),
}


def classify_exception(exc: Exception) -> str:
    name = exc.__class__.__name__.lower()
    message = str(exc).lower()
    if 'loginrequired' in name or 'login_required' in message:
        return 'LOGIN_REQUIRED'
    if 'challenge' in name or 'challenge' in message:
        return 'CHALLENGE_REQUIRED'
    if 'twofactor' in name or '2fa' in message or 'two-factor' in message:
        return 'TWO_FACTOR_REQUIRED'
    if 'ratelimit' in name or 'pleasewaitfewminutes' in name or '429' in message or 'rate limit' in message:
        return 'RATE_LIMIT'
    if 'timeout' in name or 'timed out' in message:
        return 'TIMEOUT'
    if 'connection' in name or 'network' in message:
        return 'NETWORK_ERROR'
    if isinstance(exc, sqlite3.Error):
        return 'DATABASE_ERROR'
    if isinstance(exc, PermissionError):
        return 'PERMISSION_ERROR'
    return 'UNKNOWN_ERROR'


def technical_details(exc: Exception) -> str:
    return ''.join(traceback.format_exception(type(exc), exc, exc.__traceback__))
