grade_calculator.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. """
  2. Grade Calculator Utility
  3. Pure functions for calculating durian grades and retrieving color representations
  4. for different classifications.
  5. """
  6. from typing import Optional, Tuple
  7. def calculate_durian_grade(
  8. locule_count: int,
  9. has_defects: bool,
  10. shape_class: Optional[str] = None,
  11. maturity_class: Optional[str] = None
  12. ) -> Tuple[str, str]:
  13. """
  14. Calculate durian grade based on locule count, defect status, shape, and maturity.
  15. Rules:
  16. - Has defects (any locule count) = Class C
  17. - Class A: 5 locules + Regular shape + no defects + Mature
  18. - Class B: Good quality but missing one or more Class A requirements (irregular shape, <5 locules, immature/overmature)
  19. - Class C: Has defects or doesn't meet Grade I requirements
  20. Args:
  21. locule_count: Number of locules detected
  22. has_defects: True if defects are present, False otherwise
  23. shape_class: Shape classification ('Regular' or 'Irregular')
  24. maturity_class: Maturity classification ('Immature', 'Mature', or 'Overmature')
  25. Returns:
  26. tuple: (grade_letter, grade_description)
  27. """
  28. if has_defects:
  29. return ('C', 'Durian with defects detected - Grade C (Grade II)')
  30. # Check if mature (Class A requires Mature status)
  31. is_mature = maturity_class == 'Mature' if maturity_class else True # Assume mature if not provided
  32. # No defects, now check locules, shape, and maturity
  33. if locule_count == 5 and shape_class == 'Regular' and is_mature:
  34. # Perfect conditions for Class A
  35. return ('A', 'Premium Grade: 5 locules, regular shape, mature, no defects - Class A')
  36. elif has_defects or maturity_class == 'Overmature':
  37. # Defects or overmature = Class C
  38. return ('C', f'Grade II: Has defects or is overmature - Class C')
  39. elif maturity_class == 'Immature':
  40. # Immature durian = Class B
  41. return ('B', f'Grade I: Immature durian with {locule_count} locules - Class B')
  42. elif locule_count == 5:
  43. # 5 locules but might have irregular shape or not mature
  44. if shape_class == 'Irregular':
  45. return ('B', f'Grade I: 5 locules with irregular shape - Class B')
  46. elif is_mature:
  47. return ('A', 'Premium Grade: 5 locules, regular shape, mature, no defects - Class A')
  48. else:
  49. return ('B', f'Grade I: 5 locules but not mature - Class B')
  50. elif locule_count < 5:
  51. return ('B', f'Grade I: Good quality with {locule_count} locules, no defects - Class B')
  52. else:
  53. # More than 5 locules but no defects
  54. return ('B', f'Grade I: Good quality with {locule_count} locules, no defects - Class B')
  55. def get_ripeness_color(ripeness: str) -> str:
  56. """Get color for ripeness status."""
  57. colors = {
  58. 'Unripe': '#3498db',
  59. 'Ripe': '#27ae60',
  60. 'Overripe': '#e74c3c'
  61. }
  62. return colors.get(ripeness, '#555')
  63. def get_maturity_color(maturity: str) -> str:
  64. """Get color for maturity status."""
  65. colors = {
  66. 'Immature': '#3498db',
  67. 'Mature': '#27ae60',
  68. 'Overmature': '#e74c3c'
  69. }
  70. return colors.get(maturity, '#555')
  71. def get_grade_color(grade: str) -> str:
  72. """Get color for overall grade."""
  73. colors = {
  74. 'A': '#27ae60',
  75. 'B': '#f39c12',
  76. 'C': '#e74c3c'
  77. }
  78. return colors.get(grade, '#555')