from __future__ import annotations

import argparse
import json
import os
from pathlib import Path

import mysql.connector


ROOT_DIR = Path(__file__).resolve().parents[1]
DEFAULT_ENV_PATH = ROOT_DIR / ".env"
DEFAULT_OUT_PATH = ROOT_DIR / "scripts" / "data" / "plant_reminder_actual_care_116.worklist.ndjson"


GENERIC_TIP_MARKERS = [
    "흙 표면이 마르면 물을 주고 잎 상태를 자주 확인해주세요.",
    "꽃이 오래가도록 겉흙이 마르기 전에 상태를 확인해주세요.",
    "통풍과 일조를 확보하고 흙 속까지 어느 정도 마른 뒤 물을 주세요.",
    "과습에 약하니 흙이 충분히 마른 뒤 물을 주세요.",
    "흙이 너무 마르지 않게 자주 확인하고 수확 후에는 통풍을 챙겨주세요.",
    "줄기 끝이 축 처지기 전에 물을 주고 지지대를 함께 관리해주세요.",
    "흙이 마르지 않게 유지하고 가능하면 깨끗한 물로 관리해주세요.",
]


def parse_args():
    parser = argparse.ArgumentParser(description="Generate 116-current-plant actual-care worklist")
    parser.add_argument("--out", default=str(DEFAULT_OUT_PATH))
    parser.add_argument("--env-file", default=str(DEFAULT_ENV_PATH))
    return parser.parse_args()


def load_env(env_path: str) -> None:
    path = Path(env_path)
    if not path.exists():
        return
    for line in path.read_text(encoding="utf-8").splitlines():
        if not line or line.strip().startswith("#") or "=" not in line:
            continue
        key, value = line.split("=", 1)
        os.environ.setdefault(key.strip(), value.strip())


def connect_db():
    return mysql.connector.connect(
        host=os.environ["DB_HOST"],
        port=int(os.environ.get("DB_PORT", "3306")),
        user=os.environ["DB_USER"],
        password=os.environ["DB_PASSWORD"],
        database=os.environ["DB_NAME"],
        charset="utf8mb4",
    )


def is_generic_tip(text: str) -> bool:
    stripped = (text or "").strip()
    if not stripped:
        return True
    for marker in GENERIC_TIP_MARKERS:
        if stripped.startswith(marker):
            return True
    return False


def main():
    args = parse_args()
    load_env(args.env_file)
    out_path = Path(args.out)
    out_path.parent.mkdir(parents=True, exist_ok=True)

    conn = connect_db()
    cursor = conn.cursor(dictionary=True)

    try:
        cursor.execute(
            """
            SELECT
              type_name,
              watering_cycle_days,
              sort_order,
              image_url,
              type_name_ko, type_name_en, type_name_ja, type_name_zh,
              sunlight_ko, sunlight_en, sunlight_ja, sunlight_zh,
              tip_ko, tip_en, tip_ja, tip_zh
            FROM plant_reminder_presets
            ORDER BY sort_order ASC, id ASC
            """
        )
        rows = cursor.fetchall()

        with out_path.open("w", encoding="utf-8") as fp:
            for row in rows:
                payload = {
                    "type_name": row["type_name"],
                    "watering_cycle_days": row["watering_cycle_days"],
                    "sort_order": row["sort_order"],
                    "image_url": row["image_url"],
                    "needs_actual_care_review": is_generic_tip(row.get("tip_ko") or ""),
                    "source": {
                        "reference_url": "",
                        "reference_title": "",
                        "notes": "",
                    },
                    "translations": {
                        "ko": {
                            "type_name": row.get("type_name_ko") or row["type_name"],
                            "sunlight": row.get("sunlight_ko") or "",
                            "tip": row.get("tip_ko") or "",
                        },
                        "en": {
                            "type_name": row.get("type_name_en") or "",
                            "sunlight": row.get("sunlight_en") or "",
                            "tip": row.get("tip_en") or "",
                        },
                        "ja": {
                            "type_name": row.get("type_name_ja") or "",
                            "sunlight": row.get("sunlight_ja") or "",
                            "tip": row.get("tip_ja") or "",
                        },
                        "zh": {
                            "type_name": row.get("type_name_zh") or "",
                            "sunlight": row.get("sunlight_zh") or "",
                            "tip": row.get("tip_zh") or "",
                        },
                    },
                }
                fp.write(json.dumps(payload, ensure_ascii=False) + "\n")

        print(json.dumps({"out": str(out_path), "count": len(rows)}, ensure_ascii=False, indent=2))
    finally:
        cursor.close()
        conn.close()


if __name__ == "__main__":
    main()
