from __future__ import annotations

import os
import secrets
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
STORAGE_DIR = Path(os.environ.get('INSTABOT_STORAGE_DIR', str(BASE_DIR / 'storage'))).expanduser().resolve()
LOG_DIR = STORAGE_DIR / 'logs'
SECRETS_DIR = STORAGE_DIR / 'secrets'
UPLOAD_DIR = Path(os.environ.get('INSTABOT_UPLOAD_DIR', str(BASE_DIR / 'uploads'))).expanduser().resolve()
DB_PATH = STORAGE_DIR / 'database.sqlite3'
SECRET_FILE = SECRETS_DIR / 'flask_secret.key'
SESSION_FILE = SECRETS_DIR / 'instagram_session.json'
LOCK_FILE = STORAGE_DIR / 'worker.lock'
SCHEDULER_PID = STORAGE_DIR / 'scheduler.pid'
SCHEDULER_LOG = LOG_DIR / 'scheduler.log'
CRON_LOG = LOG_DIR / 'cron.log'


def ensure_directories() -> None:
    for path in (STORAGE_DIR, LOG_DIR, SECRETS_DIR, UPLOAD_DIR):
        path.mkdir(parents=True, exist_ok=True)
    for path in (STORAGE_DIR, SECRETS_DIR):
        try:
            os.chmod(path, 0o700)
        except OSError:
            pass


def load_or_create_secret() -> str:
    ensure_directories()
    if SECRET_FILE.exists():
        return SECRET_FILE.read_text(encoding='utf-8').strip()
    value = secrets.token_urlsafe(48)
    SECRET_FILE.write_text(value, encoding='utf-8')
    try:
        os.chmod(SECRET_FILE, 0o600)
    except OSError:
        pass
    return value
