from __future__ import annotations

import uuid
from datetime import datetime
from decimal import Decimal

from app.models.site_operations_schemas import (
    SiteDiaryCreateRequest,
    SiteDiaryRecord,
)

from .constants import PROJECT_NAMES


class SiteDiaryOperationsMixin:
    """Mobile Site Diary management mixin."""

    def create_site_diary(self, payload: SiteDiaryCreateRequest) -> SiteDiaryRecord:
        diary_id = f"DIARY-{payload.project_code[:6]}-{uuid.uuid4().hex[:6].upper()}"
        proj_name = PROJECT_NAMES.get(
            payload.project_code, f"Dự Án {payload.project_code}"
        )

        total_workers = len(payload.attendance)
        total_machine_hours = sum(
            (m.total_operating_hours for m in payload.machine_logs), Decimal("0.0000")
        )

        record = SiteDiaryRecord(
            diary_id=diary_id,
            project_code=payload.project_code,
            project_name=proj_name,
            log_date=payload.log_date,
            weather_condition=payload.weather_condition,
            temperature_celsius=payload.temperature_celsius,
            engineer_name=payload.engineer_name,
            site_manager_name=payload.site_manager_name,
            work_summary=payload.work_summary,
            safety_incidents=payload.safety_incidents,
            total_workers=total_workers,
            total_machine_hours=total_machine_hours,
            attendance=payload.attendance,
            machine_logs=payload.machine_logs,
            photos=payload.photos,
            created_at=datetime.now(),
        )
        self._diaries[diary_id] = record
        return record

    def list_site_diaries(
        self, project_code: str | None = None
    ) -> list[SiteDiaryRecord]:
        if project_code:
            return [d for d in self._diaries.values() if d.project_code == project_code]
        return list(self._diaries.values())
