#!/usr/bin/env python3
"""Run annotation pipeline for UAV_VisLoc_processed dataset.

Usage:
    python scripts/run_uav_visloc.py
    python scripts/run_uav_visloc.py --source db     # only satellite
    python scripts/run_uav_visloc.py --source drone   # only drone
"""

from __future__ import annotations

import argparse
import sys
from pathlib import Path

# Ensure project root is importable.
_PROJECT_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(_PROJECT_ROOT))

import numpy as np
import torch

from src.conf.hardware_conf import HardwareConfig
from src.conf.input_conf import InputConfig
from src.conf.models_conf import ModelsConfig
from src.conf.pipeline_conf import PipelineConfig
from src.conf.seg_conf import SegConfig
from src.augmentor.io_utils import setup_logging
from src.main import run_pipeline
from scripts.seg_classes import UNIFIED_PROMPTS


INPUT_ROOT = "/home/servml/Документы/datasets/UAV_VisLoc_processed"
OUTPUT_ROOT = "/home/servml/Документы/datasets/UAV_VisLoc_processed-aug"


def main() -> None:
    parser = argparse.ArgumentParser(description="Annotate UAV_VisLoc_processed")
    parser.add_argument("--source", choices=["db", "drone", "all"], default="all",
                        help="Process only db (satellite), drone, or all (default)")
    parser.add_argument("--stages", nargs="+",
                        default=["depth", "edges", "segmentation", "chmv2"],
                        help="Stages to run")
    args = parser.parse_args()

    import gin
    gin.clear_config()

    source = None if args.source == "all" else args.source
    # UAV_VisLoc uses "drone" folder, not "query". Map for filter compatibility.
    if source == "drone":
        source = "query"

    pipeline_conf = PipelineConfig(
        input_root=INPUT_ROOT,
        output_root=OUTPUT_ROOT,
        stages=args.stages,
        save_npy=False,
        save_vis=True,
        save_safetensors=True,
        cleanup_npy=True,
        resume=True,
        source=source,
        log_level="INFO",
    )

    hw_conf = HardwareConfig(
        profile_name="rtx4090",
        total_ram_gb=24.0,
        reserve_gb=2.0,
        use_fp16=True,
        batch_size=None,  # auto
        num_workers=4,
    )

    input_conf = InputConfig(image_size=256)
    seg_conf = SegConfig(threshold=0.1, prompts=UNIFIED_PROMPTS)
    models_conf = ModelsConfig(weights_dir=str(_PROJECT_ROOT / "in" / "weights"))

    setup_logging(
        pipeline_conf.log_level,
        log_file=Path(OUTPUT_ROOT) / "pipeline.log",
    )

    torch.manual_seed(42)
    np.random.seed(42)

    run_pipeline(pipeline_conf, hw_conf, models_conf, input_conf, seg_conf)


if __name__ == "__main__":
    main()
