from __future__ import annotations

import argparse
import logging
from pathlib import Path

from src.commands.date_range import parse_date_range
from src.config.pipedrive_config import load_pipedrive_config
from src.pipedrive.client import PipedriveClient
from src.pipedrive.mapping import load_mapping_file, normalize_deals_in_range, resolve_mapping
from src.logging_setup import log_event

logger = logging.getLogger(__name__)


def register(sub: argparse._SubParsersAction) -> None:
    pd = sub.add_parser("pipedrive", help="Read deals from Pipedrive (read-only).")
    pd_sub = pd.add_subparsers(dest="pipedrive_cmd", required=True)

    validate = pd_sub.add_parser(
        "validate-mapping", help="Validate mapping file against Pipedrive deal fields."
    )
    validate.add_argument(
        "--mapping", help="Path to mapping JSON file (else env PIPEDRIVE_FIELD_MAPPING_PATH)."
    )
    validate.set_defaults(_handler=_run_validate_mapping)

    deals = pd_sub.add_parser(
        "list-deals", help="List deals with mapped fields within a date range."
    )
    deals.add_argument("--from", dest="from_date", required=True, help="Start date (YYYY-MM-DD).")
    deals.add_argument("--to", dest="to_date", required=True, help="End date (YYYY-MM-DD).")
    deals.add_argument(
        "--mapping", help="Path to mapping JSON file (else env PIPEDRIVE_FIELD_MAPPING_PATH)."
    )
    deals.set_defaults(_handler=_run_list_deals)


def _run_validate_mapping(args: argparse.Namespace) -> int:
    log_event(logger, "command.start", command="pipedrive.validate-mapping")
    cfg = load_pipedrive_config(mapping_path_override=Path(args.mapping) if args.mapping else None)
    client = PipedriveClient(api_token=cfg.api_token, base_url=cfg.base_url)
    deal_fields = client.list_deal_fields()
    data = load_mapping_file(cfg.mapping_path)
    resolved = resolve_mapping(data, deal_fields)
    print(resolved.to_json())
    log_event(logger, "command.complete", command="pipedrive.validate-mapping")
    return 0


def _run_list_deals(args: argparse.Namespace) -> int:
    log_event(logger, "command.start", command="pipedrive.list-deals")
    cfg = load_pipedrive_config(mapping_path_override=Path(args.mapping) if args.mapping else None)
    from_d, to_d = parse_date_range(args.from_date, args.to_date)

    client = PipedriveClient(api_token=cfg.api_token, base_url=cfg.base_url)
    deal_fields = client.list_deal_fields()
    data = load_mapping_file(cfg.mapping_path)
    mapping = resolve_mapping(data, deal_fields)
    deals = normalize_deals_in_range(client.iter_deals(), mapping, from_date=from_d, to_date=to_d)
    for d in deals:
        print(d.to_json())
    log_event(logger, "command.complete", command="pipedrive.list-deals")
    return 0
