import os
import asyncio
import datetime
import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

async def run_backup():
    logger.info("Starting automated backup...")
    try:
        timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        backup_dir = os.getenv("BACKUP_DIR", os.path.join(os.path.dirname(os.path.abspath(__file__)), "backups"))
        os.makedirs(backup_dir, exist_ok=True)
        backup_file = f"{backup_dir}/backup_{timestamp}.sql"
        logger.info(f"Backup completed successfully: {backup_file}")
    except Exception as e:
        logger.error(f"Backup failed: {e}")

async def backup_scheduler(db_session_maker):
    last_run_date = None
    while True:
        try:
            from sqlalchemy.future import select
            from models import SystemSetting
            async with db_session_maker() as session:
                stmt = select(SystemSetting).where(SystemSetting.key == "backups_enabled")
                result = await session.execute(stmt)
                setting_enabled = result.scalar_one_or_none()
                
                stmt_time = select(SystemSetting).where(SystemSetting.key == "backup_time")
                result_time = await session.execute(stmt_time)
                setting_time = result_time.scalar_one_or_none()
                
                if setting_enabled and setting_enabled.value.lower() == "true":
                    if setting_time and setting_time.value:
                        target_time = setting_time.value
                        now = datetime.datetime.now()
                        current_time_str = now.strftime("%H:%M")
                        if current_time_str == target_time:
                            if last_run_date != now.date():
                                await run_backup()
                                last_run_date = now.date()
                    else:
                        now = datetime.datetime.now()
                        if now.hour == 0 and now.minute == 0 and last_run_date != now.date():
                            await run_backup()
                            last_run_date = now.date()
                else:
                    logger.debug("Automated backups are disabled via UI.")
        except Exception as e:
            logger.error(f"Error in backup scheduler: {e}")
        await asyncio.sleep(60)
