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


class PlantIssueReport(Base):
    __tablename__ = "plant_issue_reports"
    id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    issue_number: Mapped[str] = mapped_column(String(30), unique=True)
    activation_id: Mapped[str] = mapped_column(String(36), ForeignKey("plant_activations.id"))
    issue_type: Mapped[str] = mapped_column(String(50))
    title: Mapped[str] = mapped_column(String(200))
    description: Mapped[str | None] = mapped_column(Text, nullable=True)
    severity: Mapped[str] = mapped_column(String(20), default="low")
    photo_url: Mapped[str | None] = mapped_column(String(500), nullable=True)
    video_url: Mapped[str | None] = mapped_column(String(500), nullable=True)
    status: Mapped[str] = mapped_column(String(20), default="open")
    assigned_to: Mapped[str | None] = mapped_column(String(36), ForeignKey("users.id"), nullable=True)
    resolution: Mapped[str | None] = mapped_column(Text, nullable=True)
    resolved_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
    recorded_by: Mapped[str | None] = mapped_column(String(36), ForeignKey("users.id"), nullable=True)
    created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())

    activation = relationship("PlantActivation", back_populates="issue_reports")


class PlantWarrantyClaim(Base):
    __tablename__ = "plant_warranty_claims"
    id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    claim_number: Mapped[str] = mapped_column(String(30), unique=True)
    activation_id: Mapped[str] = mapped_column(String(36), ForeignKey("plant_activations.id"))
    warranty_start: Mapped[datetime | None] = mapped_column(Date, nullable=True)
    warranty_end: Mapped[datetime | None] = mapped_column(Date, nullable=True)
    claim_date: Mapped[datetime] = mapped_column(Date, server_default=func.now())
    claim_type: Mapped[str] = mapped_column(String(50))
    reason: Mapped[str | None] = mapped_column(Text, nullable=True)
    photo_url: Mapped[str | None] = mapped_column(String(500), nullable=True)
    status: Mapped[str] = mapped_column(String(20), default="pending")
    nursery_response: Mapped[str | None] = mapped_column(Text, nullable=True)
    resolved_by: Mapped[str | None] = mapped_column(String(36), ForeignKey("users.id"), nullable=True)
    resolved_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
    created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())

    activation = relationship("PlantActivation")


class FarmerSupportTicket(Base):
    __tablename__ = "farmer_support_tickets"
    id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    ticket_number: Mapped[str] = mapped_column(String(30), unique=True)
    farmer_id: Mapped[str] = mapped_column(String(36), ForeignKey("farmer_profiles.id"))
    activation_id: Mapped[str | None] = mapped_column(String(36), ForeignKey("plant_activations.id"), nullable=True)
    category: Mapped[str] = mapped_column(String(50))
    priority: Mapped[str] = mapped_column(String(20), default="medium")
    subject: Mapped[str] = mapped_column(String(200))
    message: Mapped[str | None] = mapped_column(Text, nullable=True)
    photo_url: Mapped[str | None] = mapped_column(String(500), nullable=True)
    status: Mapped[str] = mapped_column(String(20), default="open")
    assigned_to: Mapped[str | None] = mapped_column(String(36), ForeignKey("users.id"), nullable=True)
    response: Mapped[str | None] = mapped_column(Text, nullable=True)
    resolved_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
    created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())

    farmer = relationship("FarmerProfile")
    activation = relationship("PlantActivation")
