from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text, Float, ForeignKey, JSON
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from app.database import Base
from datetime import datetime


class Donation(Base):
    __tablename__ = "donations"
    
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String(255), nullable=False)
    description = Column(Text, nullable=False)
    story = Column(Text, nullable=True)
    category = Column(String(100), nullable=False)
    location = Column(String(255), nullable=False)
    contact_email = Column(String(255), nullable=False)
    contact_phone = Column(String(20), nullable=True)
    preferred_contact = Column(String(20), default="email")
    image_url = Column(String(500), nullable=True)
    status = Column(String(50), default="active")
    user_id = Column(Integer, ForeignKey("users.id"), nullable=True)
    views = Column(Integer, default=0)
    rating = Column(Float, default=0.0)
    value = Column(Float, default=0.0)
    age = Column(Integer, nullable=True)
    
    # Propriété spécifique
    property_type = Column(String(100), nullable=True)
    property_surface = Column(String(50), nullable=True)
    property_rooms = Column(String(20), nullable=True)
    property_floor = Column(String(20), nullable=True)
    property_condition = Column(String(100), nullable=True)
    property_year = Column(Integer, nullable=True)
    property_features = Column(JSON, nullable=True)
    property_address = Column(Text, nullable=True)
    cash_amount = Column(Float, default=0.0)
    total_value = Column(Float, default=0.0)
    monthly_charges = Column(Float, nullable=True)
    property_tax = Column(Float, nullable=True)
    insurance = Column(Float, nullable=True)
    priority_targets = Column(JSON, nullable=True)
    conditions = Column(JSON, nullable=True)
    excluded_targets = Column(JSON, nullable=True)
    availability = Column(String(100), nullable=True)
    process_duration = Column(String(100), nullable=True)
    required_documents = Column(JSON, nullable=True)
    
    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())
    
    # Relations
    user = relationship("User", back_populates="donations")
    requests = relationship("DonationRequest", back_populates="donation", cascade="all, delete-orphan")
    
    def __repr__(self):
        return f"<Donation(id={self.id}, title='{self.title}', status='{self.status}')>"


class DonationRequest(Base):
    __tablename__ = "donation_requests"
    
    id = Column(Integer, primary_key=True, index=True)
    donation_id = Column(Integer, ForeignKey("donations.id"), nullable=False)
    requester_name = Column(String(255), nullable=False)
    requester_email = Column(String(255), nullable=False)
    requester_phone = Column(String(20), nullable=True)
    message = Column(Text, nullable=False)
    status = Column(String(50), default="pending")
    urgency = Column(String(50), default="normal")
    created_at = Column(DateTime, default=func.now())
    updated_at = Column(DateTime, default=func.now(), onupdate=func.now())
    
    # Relations
    donation = relationship("Donation", back_populates="requests")
    
    def __repr__(self):
        return f"<DonationRequest(id={self.id}, donation_id={self.donation_id}, status='{self.status}')>"
