# modules/utils.py
import logging
from typing import Optional
logger = logging.getLogger(__name__)
def validate_inputs(student_name: str, essay_text: str, essay_file) -> Optional[str]:
if not student_name or not student_name.strip():
return "❌ طالب علم کا نام درکار ہے | Student name is required"
if not essay_text and essay_file is None:
return "❌ مضمون درکار ہے (فائل یا متن) | Essay is required (file or text)"
return None
def get_performance_label(score: int) -> tuple:
"""
Get performance label and color based on score
Returns: (label, color, emoji)
"""
if score >= 90:
return ("Exceptional", "🟢", "🏆")
elif score >= 80:
return ("Excellent", "🟢", "⭐")
elif score >= 70:
return ("Very Good", "🟡", "👍")
elif score >= 60:
return ("Good", "🟡", "✓")
elif score >= 50:
return ("Pass", "🟠", "📝")
else:
return ("Needs Improvement", "🔴", "💪")
def format_results(student_name: str, grade_level: int, essay_type: str, result: dict, word_count: int) -> str:
score = result['total_score']
grade = result['grade']
label, color, emoji = get_performance_label(score)
md = f"""
# {color} جانچ کے نتائج | Grading Results
---
## 📋 طالب علم کی تفصیلات | Student Details
| معلومات | تفصیل |
|---------|-------|
| **نام** \| **Name** | {student_name} |
| **جماعت** \| **Grade** | {grade_level} |
| **مضمون کی قسم** \| **Essay Type** | {essay_type} |
| **الفاظ** \| **Words** | {word_count} |
---
## 🎯 کل نمبر | Total Score
{int(score)}/100
گریڈ | Grade: {grade}
{emoji} {label}
---
## 📊 تفصیلی سکور | Detailed Scores
| شعبہ \| Category | نمبر \| Score | زیادہ سے زیادہ \| Max | فیصد \| % |
|-----------------|--------------|----------------------|----------|
| **مواد اور استدلال** \| **Content & Arguments** | {result['scores']['content']} | 40 | {(result['scores']['content']/40*100):.1f}% |
| **تنظیم اور ساخت** \| **Organization** | {result['scores']['organization']} | 20 | {(result['scores']['organization']/20*100):.1f}% |
| **زبان اور اسلوب** \| **Language & Style** | {result['scores']['language']} | 20 | {(result['scores']['language']/20*100):.1f}% |
| **گرامر اور املا** \| **Grammar & Spelling** | {result['scores']['grammar']} | 20 | {(result['scores']['grammar']/20*100):.1f}% |
---
"""
# Structure Analysis
if 'structure_analysis' in result:
struct = result['structure_analysis']
md += "\n## 🏗️ ساخت کا تجزیہ | Structure Analysis\n\n"
md += f"- **تعارف | Introduction**: {'✅ موجود' if struct.get('has_introduction') else '❌ غائب'}\n"
md += f"- **باڈی پیراگرافس | Body Paragraphs**: {struct.get('body_paragraphs_count', 0)} "
if struct.get('body_paragraphs_count', 0) < 2:
md += "⚠️ (کم از کم 2 چاہیے | Need at least 2)\n"
else:
md += "✅\n"
md += f"- **منتقلی | Transitions**: {'✅ اچھی' if struct.get('has_transitions') else '❌ کمزور'}\n"
md += f"- **اختتام | Conclusion**: {'✅ موجود' if struct.get('has_conclusion') else '❌ غائب'}\n\n"
if struct.get('structure_feedback'):
md += f"**رائے | Feedback**: {struct['structure_feedback']}\n\n---\n"
md += "\n## ✅ طاقتوں کے پہلو | Strengths\n\n"
strengths = result.get('strengths', [])
if strengths:
for i, strength in enumerate(strengths, 1):
md += f"{i}. {strength}\n"
else:
md += "*کوئی خاص طاقت نوٹ نہیں کی گئی*\n"
md += "\n---\n\n## ⚠️ بہتری کے شعبے | Areas for Improvement\n\n"
weaknesses = result.get('weaknesses', [])
if weaknesses:
for i, weakness in enumerate(weaknesses, 1):
md += f"### {i}. {weakness.get('issue', 'مسئلہ')}\n\n"
if 'example' in weakness and weakness['example']:
md += f"**مثال | Example**: {weakness['example']}\n\n"
if 'suggestion' in weakness and weakness['suggestion']:
md += f"**💡 تجویز | Suggestion**: {weakness['suggestion']}\n\n"
else:
md += "*بہترین کارکردگی!*\n\n"
grammar_errors = result.get('grammar_errors', [])
if grammar_errors and len(grammar_errors) > 0:
md += "\n---\n\n## 📝 گرامر کی غلطیاں | Grammar Errors\n\n"
for i, error in enumerate(grammar_errors[:5], 1):
md += f"{i}. ❌ **{error.get('error', '')}** → ✅ **{error.get('correction', '')}**\n"
if 'explanation' in error and error['explanation']:
md += f" - *{error['explanation']}*\n"
spelling_errors = result.get('spelling_errors', [])
if spelling_errors and len(spelling_errors) > 0:
md += "\n---\n\n## 🔤 املا کی غلطیاں | Spelling Errors\n\n"
for i, error in enumerate(spelling_errors[:5], 1):
md += f"{i}. ❌ **{error.get('error', '')}** → ✅ **{error.get('correction', '')}**\n"
suggestions = result.get('improvement_suggestions', [])
if suggestions and len(suggestions) > 0:
md += "\n---\n\n## 💡 بہتری کی تجاویز | Improvement Suggestions\n\n"
for i, suggestion in enumerate(suggestions, 1):
md += f"{i}. {suggestion}\n"
overall_feedback = result.get('overall_feedback', '')
if overall_feedback:
md += f"\n---\n\n## 💬 مجموعی تبصرہ | Overall Feedback\n\n{overall_feedback}\n"
md += """
---
یاد رکھیں | Remember: ہر غلطی سیکھنے کا موقع ہے!
Every mistake is a learning opportunity!
"""
return md