import uuid
from datetime import datetime
from sqlalchemy import String, DateTime, Float, Text, ForeignKey, Integer, func
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base


class PlantCategory(Base):
    __tablename__ = "plant_categories"
    id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    name: Mapped[str] = mapped_column(String(100), unique=True)
    description: Mapped[str | None] = mapped_column(Text, nullable=True)
    icon: Mapped[str | None] = mapped_column(String(50), nullable=True)
    created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
    varieties = relationship("PlantVariety", back_populates="category", cascade="all, delete-orphan")


class PlantVariety(Base):
    __tablename__ = "plant_varieties"
    id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    name: Mapped[str] = mapped_column(String(100))
    category_id: Mapped[str] = mapped_column(ForeignKey("plant_categories.id"))
    plant_type: Mapped[str] = mapped_column(String(50), default="Outdoor")
    life_cycle: Mapped[str | None] = mapped_column(String(50), nullable=True)
    growing_season: Mapped[str | None] = mapped_column(String(50), nullable=True)
    sunlight: Mapped[str | None] = mapped_column(String(50), nullable=True)
    water_requirement: Mapped[str | None] = mapped_column(String(50), nullable=True)
    soil_type: Mapped[str | None] = mapped_column(String(100), nullable=True)
    created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
    category = relationship("PlantCategory", back_populates="varieties")
    plants = relationship("Plant", back_populates="variety", cascade="all, delete-orphan")


class Plant(Base):
    __tablename__ = "plants"
    id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    code: Mapped[str] = mapped_column(String(30), unique=True)
    name: Mapped[str] = mapped_column(String(100))
    scientific_name: Mapped[str | None] = mapped_column(String(100), nullable=True)
    local_name: Mapped[str | None] = mapped_column(String(100), nullable=True)
    variety_id: Mapped[str | None] = mapped_column(ForeignKey("plant_varieties.id"), nullable=True)
    category_id: Mapped[str | None] = mapped_column(ForeignKey("plant_categories.id"), nullable=True)
    description: Mapped[str | None] = mapped_column(Text, nullable=True)
    fertilizer_schedule: Mapped[str | None] = mapped_column(Text, nullable=True)
    pest_info: Mapped[str | None] = mapped_column(Text, nullable=True)
    care_instructions: Mapped[str | None] = mapped_column(Text, nullable=True)
    retail_price: Mapped[float] = mapped_column(Float, default=0.0)
    wholesale_price: Mapped[float] = mapped_column(Float, default=0.0)
    dealer_price: Mapped[float] = mapped_column(Float, default=0.0)
    barcode: Mapped[str | None] = mapped_column(String(50), nullable=True)
    image_url: Mapped[str | None] = mapped_column(String(500), nullable=True)
    is_active: Mapped[bool] = mapped_column(default=True)
    created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
    updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), onupdate=func.now())
    variety = relationship("PlantVariety", back_populates="plants")
    batches = relationship("ProductionBatch", back_populates="plant", cascade="all, delete-orphan")
