import os
import secrets
from paths import DATA_DIR, resource_path

BASE_DIR = DATA_DIR


def _local_secret_key():
    """Create a per-installation Flask secret without hard-coding it in source."""
    secret_path = os.path.join(BASE_DIR, ".app_secret")
    try:
        if os.path.exists(secret_path):
            with open(secret_path, "r", encoding="utf-8") as secret_file:
                return secret_file.read().strip()
        value = secrets.token_urlsafe(48)
        with open(secret_path, "w", encoding="utf-8") as secret_file:
            secret_file.write(value)
        return value
    except OSError:
        # A production installation should provide POS_SECRET_KEY explicitly.
        return secrets.token_urlsafe(48)

def get_database_uri():
    db_url = os.environ.get("DATABASE_URL")
    sqlite_url = "sqlite:///" + os.path.join(BASE_DIR, "shop.db")
    
    use_remote = os.environ.get("POS_USE_REMOTE_DB", "0") == "1"
    if use_remote and db_url and db_url.strip():
        db_url = db_url.strip()
        if db_url.startswith("postgres"):
            try:
                from sqlalchemy import create_engine
                test_engine = create_engine(db_url, connect_args={"connect_timeout": 2})
                with test_engine.connect() as conn:
                    pass
                test_engine.dispose()
                return db_url
            except Exception as e:
                print(f"[WARNING] Remote DB failed ({e}). Using local SQLite: {sqlite_url}")
                return sqlite_url
        return db_url
        
    return sqlite_url

class Config:
    SECRET_KEY = os.environ.get("POS_SECRET_KEY") or _local_secret_key()
    SQLALCHEMY_DATABASE_URI = get_database_uri()
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SESSION_COOKIE_HTTPONLY = True
    SESSION_COOKIE_SAMESITE = "Lax"
    # Set to 0 only while developing. Customer installations enforce the trial/key.
    LICENSE_ENFORCEMENT = os.environ.get("POS_LICENSE_ENFORCEMENT", "1") == "1"
    LICENSE_PUBLIC_KEY_PATH = os.environ.get(
        "POS_LICENSE_PUBLIC_KEY_PATH",
        resource_path("license_public_key.pem")
    )

    # ---- Email (Gmail SMTP) — used for the "Forgot password" code email ----
    # Set these two environment variables before running the app:
    #   POS_GMAIL_ADDRESS       e.g. yourshop@gmail.com
    #   POS_GMAIL_APP_PASSWORD  a 16-character Gmail "App Password"
    #                           (Google Account -> Security -> 2-Step Verification -> App Passwords)
    # Do NOT use your normal Gmail login password here — Gmail blocks that for SMTP.
    MAIL_SERVER = "smtp.gmail.com"
    MAIL_PORT = 587
    MAIL_USE_TLS = True
    MAIL_USERNAME = os.environ.get("POS_GMAIL_ADDRESS", "")
    MAIL_PASSWORD = os.environ.get("POS_GMAIL_APP_PASSWORD", "")
    MAIL_SENDER_NAME = os.environ.get("POS_MAIL_SENDER_NAME", "Shop Manager POS")
