"""
SCM Domain Entities — Vendor Evaluation.

ارزیابی عملکرد تأمین‌کنندگان.
"""
from dataclasses import dataclass, field
from datetime import date
from decimal import Decimal
from enum import Enum
from typing import Optional, List
from uuid import UUID

from shared.base_classes.entity import TenantEntity


class EvaluationStatus(str, Enum):
    DRAFT = "DRAFT"
    IN_PROGRESS = "IN_PROGRESS"
    COMPLETED = "COMPLETED"
    CANCELLED = "CANCELLED"


class EvaluationRating(str, Enum):
    EXCELLENT = "EXCELLENT"
    GOOD = "GOOD"
    AVERAGE = "AVERAGE"
    POOR = "POOR"
    UNACCEPTABLE = "UNACCEPTABLE"


@dataclass
class EvaluationCriteria(TenantEntity):
    """معیار ارزیابی تأمین‌کننده."""
    criteria_code: str = ""
    criteria_name: str = ""
    description: str = ""
    weight: Decimal = Decimal("0")
    max_score: Decimal = Decimal("100")
    is_active: bool = True


@dataclass
class EvaluationPeriod(TenantEntity):
    """دوره ارزیابی."""
    period_name: str = ""
    start_date: Optional[date] = None
    end_date: Optional[date] = None
    is_active: bool = True


@dataclass
class VendorEvaluationScore(TenantEntity):
    """امتیاز ارزیابی per criteria."""
    evaluation_id: Optional[UUID] = None
    criteria_id: Optional[UUID] = None
    criteria_name: str = ""
    weight: Decimal = Decimal("0")
    score: Decimal = Decimal("0")
    weighted_score: Decimal = Decimal("0")
    comments: str = ""

    def calculate_weighted_score(self):
        self.weighted_score = self.score * self.weight / 100


@dataclass
class VendorEvaluation(TenantEntity):
    """ارزیابی تأمین‌کننده — Aggregate Root."""
    vendor_id: Optional[UUID] = None
    vendor_name: str = ""
    period_id: Optional[UUID] = None
    period_name: str = ""
    evaluator_id: Optional[UUID] = None
    evaluator_name: str = ""
    status: EvaluationStatus = EvaluationStatus.DRAFT
    evaluation_date: Optional[date] = None
    total_score: Decimal = Decimal("0")
    rating: Optional[EvaluationRating] = None
    comments: str = ""
    scores: List[VendorEvaluationScore] = field(default_factory=list)

    def calculate_total(self):
        """محاسبه امتیاز کل."""
        for score in self.scores:
            score.calculate_weighted_score()
        self.total_score = sum(s.weighted_score for s in self.scores)
        self._determine_rating()

    def _determine_rating(self):
        if self.total_score >= 90:
            self.rating = EvaluationRating.EXCELLENT
        elif self.total_score >= 75:
            self.rating = EvaluationRating.GOOD
        elif self.total_score >= 60:
            self.rating = EvaluationRating.AVERAGE
        elif self.total_score >= 40:
            self.rating = EvaluationRating.POOR
        else:
            self.rating = EvaluationRating.UNACCEPTABLE

    def complete(self):
        if not self.scores:
            raise ValueError("Evaluation must have at least one score")
        self.calculate_total()
        self.status = EvaluationStatus.COMPLETED

    def validate(self):
        if not self.vendor_id:
            raise ValueError("Vendor is required")
        if not self.period_id:
            raise ValueError("Evaluation period is required")
