import uuid from sqlalchemy import Float, Integer, String, Boolean, ForeignKey, func from sqlalchemy.dialects.postgresql import JSONB, UUID from sqlalchemy.orm import Mapped, mapped_column from datetime import datetime from app.database import Base class Calculation(Base): __tablename__ = "calculations" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) file_name: Mapped[str] = mapped_column(String(255), nullable=False) file_format: Mapped[str] = mapped_column(String(10), nullable=False) file_path: Mapped[str | None] = mapped_column(String(500)) volume_cm3: Mapped[float] = mapped_column(Float, nullable=False) surface_area_cm2: Mapped[float | None] = mapped_column(Float) bounding_box: Mapped[dict | None] = mapped_column(JSONB) is_watertight: Mapped[bool | None] = mapped_column(Boolean) triangle_count: Mapped[int | None] = mapped_column(Integer) material_id: Mapped[int] = mapped_column(Integer, ForeignKey("materials.id"), nullable=False) infill_percent: Mapped[int] = mapped_column(Integer, default=30) layer_height_mm: Mapped[float] = mapped_column(Float, default=0.2) quantity: Mapped[int] = mapped_column(Integer, default=1) post_processing: Mapped[dict] = mapped_column(JSONB, default=list) weight_grams: Mapped[float | None] = mapped_column(Float) material_cost_rub: Mapped[float | None] = mapped_column(Float) time_cost_rub: Mapped[float | None] = mapped_column(Float) print_time_hours: Mapped[float | None] = mapped_column(Float) post_processing_cost_rub: Mapped[float | None] = mapped_column(Float) total_rub: Mapped[float | None] = mapped_column(Float) estimated_days: Mapped[int | None] = mapped_column(Integer) created_at: Mapped[datetime] = mapped_column(default=func.now())