import uuid

from sqlalchemy.orm import Session

from app.models.stubs import AIModel, ModelStatus, ModelVersion


def build_modelfile(base_model: str, system_prompt: str | None, parameters: dict[str, str] | None) -> str:
    lines = [f"FROM {base_model}"]
    if system_prompt:
        escaped = system_prompt.replace('"""', '\\"\\"\\"')
        lines.append(f'SYSTEM """{escaped}"""')
    for key, value in (parameters or {}).items():
        lines.append(f"PARAMETER {key} {value}")
    return "\n".join(lines)


def register_model_version(
    db: Session,
    project_id: uuid.UUID,
    name: str,
    base_model: str,
    tag: str,
    created_by: uuid.UUID | None,
    notes: str | None = None,
    metrics: dict | None = None,
    adapter_path: str | None = None,
    task_type: str = "instruction-tuning",
) -> ModelVersion:
    model = db.query(AIModel).filter(AIModel.project_id == project_id, AIModel.name == name).one_or_none()
    if model is None:
        model = AIModel(
            project_id=project_id, name=name, base_model=base_model, task_type=task_type, status=ModelStatus.ready
        )
        db.add(model)
        db.flush()
    else:
        model.status = ModelStatus.ready

    existing_versions = db.query(ModelVersion).filter(ModelVersion.model_id == model.id).count()
    version = ModelVersion(
        model_id=model.id,
        version=f"v{existing_versions + 1}",
        merged_path=tag,
        adapter_path=adapter_path,
        metrics=metrics or {},
        notes=notes,
        created_by=created_by,
    )
    db.add(version)
    db.commit()
    db.refresh(version)
    return version
