from datetime import datetime

from sqlalchemy import (Column, DateTime, Float, Integer, String, Text,
                        create_engine)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()


class Photo(Base):
    __tablename__ = "photos"

    id = Column(Integer, primary_key=True, autoincrement=True)
    input_filename = Column(String, nullable=False)
    thumbnail_filename = Column(String, nullable=False)
    focal_length = Column(String)
    aperture = Column(String)
    shutter_speed = Column(String)
    date_taken = Column(DateTime)
    iso = Column(Integer)
    width = Column(Integer)
    height = Column(Integer)
    highlight_color = Column(String)
    orientation = Column(Integer)
    unique_key = Column(String(16), nullable=False)


class SiteConfig(Base):
    __tablename__ = "site_config"

    id = Column(Integer, primary_key=True, autoincrement=True)
    # Appearance
    site_title = Column(String, nullable=False, default="Spectra")
    accent_color = Column(String, nullable=False, default="#007bff")

    # About
    author_name = Column(String, nullable=False, default="Your Name")
    author_location = Column(String, nullable=False, default="Your Location")
    profile_image = Column(String, nullable=False, default="/static/profile.jpg")
    bio = Column(
        Text,
        nullable=False,
        default="Write your bio in *markdown* here.\n\nSupports **multiple** paragraphs.",
    )

    # Metadata
    updated_at = Column(DateTime, default=datetime.utcnow)


engine = create_engine("sqlite:///photos.db")


def init_db():
    session = None
    try:
        Base.metadata.create_all(engine)
        # Create default site config if none exists
        session = Session()
        if not session.query(SiteConfig).first():
            session.add(SiteConfig())
            session.commit()
    except Exception as e:
        # Tables already exist, skip creation
        pass
    finally:
        if session:
            session.close()


init_db()
Session = sessionmaker(bind=engine)