from __future__ import annotations

from .db import MysqlCli


DEFAULT_SYNC_MAX_WORKERS = 3
MIN_SYNC_MAX_WORKERS = 1
MAX_SYNC_MAX_WORKERS = 16


def validate_sync_max_workers(value: object) -> int:
    try:
        workers = int(str(value))
    except (TypeError, ValueError) as exc:
        raise ValueError("Informe uma quantidade valida de workers.") from exc
    if not MIN_SYNC_MAX_WORKERS <= workers <= MAX_SYNC_MAX_WORKERS:
        raise ValueError(
            f"A quantidade deve ficar entre {MIN_SYNC_MAX_WORKERS} e {MAX_SYNC_MAX_WORKERS}."
        )
    return workers


def get_sync_max_workers(db: MysqlCli) -> int:
    rows = db.query_rows(
        """
SELECT sync_max_workers
FROM nfse_runtime_config
WHERE id = 1
LIMIT 1;
"""
    )
    if not rows:
        return DEFAULT_SYNC_MAX_WORKERS
    try:
        return validate_sync_max_workers(rows[0][0])
    except ValueError:
        return DEFAULT_SYNC_MAX_WORKERS


def set_sync_max_workers(db: MysqlCli, value: object) -> int:
    workers = validate_sync_max_workers(value)
    db.execute(
        f"""
INSERT INTO nfse_runtime_config (id, sync_max_workers)
VALUES (1, {workers})
ON DUPLICATE KEY UPDATE sync_max_workers = VALUES(sync_max_workers);
"""
    )
    return workers
