from __future__ import annotations

import argparse
import json
import os
import time
from pathlib import Path
from urllib.parse import quote
from urllib.error import HTTPError, URLError
from urllib.request import Request, urlopen

import mysql.connector


ROOT_DIR = Path(__file__).resolve().parents[1]
DEFAULT_ENV_PATH = ROOT_DIR / ".env"


CANDIDATES = [
    {"ko": "피쉬본 선인장", "en": "Fishbone Cactus", "days": 9, "sunlight": "밝은 간접광", "tip": "숲성 선인장이므로 일반 선인장보다 물을 조금 더 자주 주되, 흙이 오래 젖어 있지는 않게 해주세요."},
    {"ko": "립살리스", "en": "Rhipsalis", "days": 8, "sunlight": "밝은 간접광", "tip": "가느다란 줄기가 쪼글해지기 전에 흙 상태를 보고, 거의 마르면 물을 주세요."},
    {"ko": "에피필룸 옥스페탈룸", "en": "Epiphyllum oxypetalum", "days": 7, "sunlight": "밝은 간접광", "tip": "겉흙이 마르면 충분히 물을 주고, 꽃눈이 잡힐 때는 자리를 자주 바꾸지 마세요."},
    {"ko": "틸레코돈", "en": "Tylecodon", "days": 14, "sunlight": "밝은 곳", "tip": "생장기에는 흙이 마른 뒤 물을 주고, 휴면기에는 과습을 특히 조심해주세요."},
    {"ko": "세로페기아 우디", "en": "String of Hearts", "days": 8, "sunlight": "밝은 간접광", "tip": "덩굴 잎이 쪼글해지기 전에 확인하고, 흙이 마르면 가볍게 물을 주세요."},
    {"ko": "부다스 템플", "en": "Buddha's Temple", "days": 12, "sunlight": "밝은 곳", "tip": "통풍 좋은 곳에서 흙이 완전히 마른 뒤 물을 주고, 물받침 물은 남기지 마세요."},
    {"ko": "파키포디움", "en": "Pachypodium", "days": 14, "sunlight": "햇빛 필요", "tip": "생장기에는 건조 후 물을 주고 겨울에는 물주기를 크게 줄여주세요."},
    {"ko": "아데니움", "en": "Desert Rose", "days": 10, "sunlight": "햇빛 필요", "tip": "강한 빛을 충분히 받고, 흙이 마른 뒤 물을 주며 추운 시기에는 건조하게 관리해주세요."},
    {"ko": "유포르비아 트리고나", "en": "African Milk Tree", "days": 12, "sunlight": "밝은 곳", "tip": "줄기가 무르지 않도록 흙이 완전히 마른 뒤 물을 주고, 겨울에는 횟수를 줄여주세요."},
    {"ko": "유포르비아 밀리", "en": "Crown of Thorns", "days": 9, "sunlight": "햇빛 필요", "tip": "꽃을 오래 보려면 햇빛을 충분히 받고, 흙이 마를 때마다 물을 주세요."},
    {"ko": "유포르비아 오베사", "en": "Baseball Plant", "days": 14, "sunlight": "밝은 곳", "tip": "구형 줄기가 무르지 않게 완전히 마른 뒤 물을 주고, 통풍을 유지해주세요."},
    {"ko": "코노피튬", "en": "Conophytum", "days": 15, "sunlight": "밝은 곳", "tip": "탈피기에는 물을 과하게 주지 말고, 생장기에도 흙이 충분히 말랐을 때만 주세요."},
    {"ko": "오십령옥", "en": "Pleiospilos nelii", "days": 15, "sunlight": "밝은 곳", "tip": "몸체가 단단할 때는 물을 아끼고, 주름이 생길 때만 소량 보충해주세요."},
    {"ko": "가스테리아", "en": "Gasteria", "days": 11, "sunlight": "밝은 간접광", "tip": "직사광이 강한 시간은 피하고, 흙이 완전히 마른 뒤 물을 주세요."},
    {"ko": "산세베리아 문샤인", "en": "Sansevieria Moonshine", "days": 13, "sunlight": "밝은 간접광", "tip": "잎색을 유지하려면 너무 어둡지 않게 두고, 흙이 마른 뒤 물을 주세요."},
    {"ko": "산세베리아 실린드리카", "en": "Sansevieria Cylindrica", "days": 13, "sunlight": "밝은 간접광", "tip": "과습에 약하므로 토양이 충분히 말랐을 때만 물을 주는 편이 좋습니다."},
    {"ko": "하월시아 쿠페리", "en": "Haworthia cooperi", "days": 10, "sunlight": "밝은 간접광", "tip": "투명한 잎 끝이 물러지지 않도록 흙이 마른 뒤 물을 주고 강한 직사광은 피해주세요."},
    {"ko": "알부카 스피랄리스", "en": "Albuca spiralis", "days": 9, "sunlight": "햇빛 필요", "tip": "잎이 꼬이는 모양을 유지하려면 빛을 충분히 받고, 생장기에는 흙이 마르면 물을 주세요."},
    {"ko": "크라슐라 골룸", "en": "Crassula Gollum", "days": 11, "sunlight": "밝은 곳", "tip": "통통한 잎이 물러지지 않게 흙이 충분히 마른 뒤 물을 주고, 겨울엔 더 드물게 주세요."},
    {"ko": "센시오 페레그리누스", "en": "String of Dolphins", "days": 9, "sunlight": "밝은 간접광", "tip": "잎 모양이 납작해지기 전에 확인하고, 흙이 마르면 물을 주세요."},
    {"ko": "도르스테니아 포에티다", "en": "Dorstenia foetida", "days": 10, "sunlight": "밝은 곳", "tip": "생장기에는 겉흙이 마르면 물을 주고, 겨울에는 건조하게 관리해주세요."},
    {"ko": "세네시오 라디칸스", "en": "String of Bananas", "days": 9, "sunlight": "밝은 간접광", "tip": "줄기 끝이 쭈글해지기 전에 물을 주고, 흙은 오래 젖어 있지 않게 해주세요."},
    {"ko": "세네시오 바리게이티드 펄스", "en": "Variegated String of Pearls", "days": 10, "sunlight": "밝은 간접광", "tip": "무늬가 흐려지지 않게 밝게 두고, 흙이 충분히 말랐을 때 물을 주세요."},
    {"ko": "디시디아 누뭄라리아", "en": "String of Nickels", "days": 7, "sunlight": "밝은 간접광", "tip": "바크나 가벼운 배지가 거의 마르면 물을 주고, 뿌리가 오래 젖지 않게 해주세요."},
    {"ko": "디시디아 오바타", "en": "Watermelon Dischidia", "days": 7, "sunlight": "밝은 간접광", "tip": "잎이 얇아지기 전에 수분을 보충하되, 통풍은 항상 확보해주세요."},
    {"ko": "호야 케리", "en": "Hoya kerrii", "days": 10, "sunlight": "밝은 간접광", "tip": "두꺼운 잎에 수분을 저장하므로 흙이 충분히 말랐을 때 물을 주세요."},
    {"ko": "호야 크림슨퀸", "en": "Hoya Krimson Queen", "days": 9, "sunlight": "밝은 간접광", "tip": "무늬 잎을 유지하려면 밝게 두고, 화분 속 흙이 마르면 물을 주세요."},
    {"ko": "호야 오보바타", "en": "Hoya obovata", "days": 10, "sunlight": "밝은 간접광", "tip": "꽃대가 생기면 자리를 자주 바꾸지 말고, 흙이 마른 뒤 물을 주세요."},
    {"ko": "스킨답서스 픽투스", "en": "Satin Pothos", "days": 7, "sunlight": "밝은 간접광", "tip": "은빛 무늬를 선명하게 보려면 밝은 곳에서 겉흙이 마를 때 물을 주세요."},
    {"ko": "스킨답서스 트루비", "en": "Scindapsus treubii", "days": 8, "sunlight": "밝은 간접광", "tip": "두꺼운 잎이라 약간 건조하게 관리하고, 흙이 마르면 충분히 물을 주세요."},
    {"ko": "네온 포토스", "en": "Neon Pothos", "days": 6, "sunlight": "밝은 간접광", "tip": "형광빛 잎색이 연해지지 않게 밝게 두고, 겉흙이 마르면 물을 주세요."},
    {"ko": "에피프렘넘 엔조이", "en": "Epipremnum N'Joy", "days": 7, "sunlight": "밝은 간접광", "tip": "무늬 잎을 유지하려면 밝은 간접광이 좋고, 흙이 마를 때마다 물을 주세요."},
    {"ko": "몬스테라 아단소니", "en": "Monstera adansonii", "days": 6, "sunlight": "밝은 간접광", "tip": "잎 구멍이 잘 발달하도록 밝은 곳에 두고, 겉흙이 마르면 물을 주세요."},
    {"ko": "몬스테라 알보", "en": "Monstera Albo", "days": 6, "sunlight": "밝은 간접광", "tip": "무늬가 많은 잎은 빛이 더 필요하니 밝게 두고, 흙이 마르면 물을 주세요."},
    {"ko": "필로덴드론 브라질", "en": "Philodendron Brasil", "days": 7, "sunlight": "밝은 간접광", "tip": "무늬가 흐려지지 않게 밝게 두고, 흙이 마르면 충분히 물을 주세요."},
    {"ko": "필로덴드론 멜라노크리섬", "en": "Philodendron melanochrysum", "days": 6, "sunlight": "밝은 간접광", "tip": "벨벳 잎이 상하지 않게 강한 직사광은 피하고, 겉흙이 마르면 물을 주세요."},
    {"ko": "필로덴드론 핑크 프린세스", "en": "Pink Princess Philodendron", "days": 7, "sunlight": "밝은 간접광", "tip": "분홍 무늬를 유지하려면 밝은 곳이 좋고, 흙이 마르면 물을 주세요."},
    {"ko": "안스리움 클라리네르비움", "en": "Anthurium clarinervium", "days": 6, "sunlight": "밝은 간접광", "tip": "두꺼운 잎이라도 완전히 마르기 전 물을 주고, 공중 습도도 함께 챙겨주세요."},
    {"ko": "안스리움 베이치", "en": "Anthurium veitchii", "days": 6, "sunlight": "밝은 간접광", "tip": "길게 늘어지는 잎이 찢어지지 않게 습도를 유지하고, 배지가 마르면 물을 주세요."},
    {"ko": "베고니아 마큘라", "en": "Polka Dot Begonia", "days": 5, "sunlight": "밝은 간접광", "tip": "잎에 직접 물을 많이 묻히기보다 흙으로 물을 주고, 통풍을 유지해주세요."},
    {"ko": "베고니아 렉스", "en": "Rex Begonia", "days": 5, "sunlight": "밝은 간접광", "tip": "화려한 잎을 유지하려면 강한 직사광은 피하고, 흙이 마르기 전에 상태를 봐주세요."},
    {"ko": "베고니아 브레비리모사", "en": "Begonia brevirimosa", "days": 5, "sunlight": "밝은 간접광", "tip": "과습은 피하되 건조에도 약하니, 겉흙이 마르기 시작할 때 물을 주세요."},
    {"ko": "페퍼로미아 아르гир레이아", "en": "Watermelon Peperomia", "days": 7, "sunlight": "밝은 간접광", "tip": "줄기 밑동이 물러지지 않게 흙이 어느 정도 마른 뒤 물을 주세요."},
    {"ko": "페퍼로미아 카페라타", "en": "Ripple Peperomia", "days": 6, "sunlight": "밝은 간접광", "tip": "잎 주름 사이가 오래 젖지 않게 하고, 겉흙이 마르면 물을 주세요."},
    {"ko": "페퍼로미아 호프", "en": "Peperomia Hope", "days": 8, "sunlight": "밝은 간접광", "tip": "잎에 수분을 저장하므로 흙이 충분히 마른 뒤 물을 주세요."},
    {"ko": "아글라오네마 실버퀸", "en": "Aglaonema Silver Queen", "days": 7, "sunlight": "밝은 간접광", "tip": "은빛 무늬가 흐려지지 않게 어두운 곳은 피하고, 흙이 마르면 물을 주세요."},
    {"ko": "아글라오네마 레드발렌타인", "en": "Aglaonema Red Valentine", "days": 7, "sunlight": "밝은 간접광", "tip": "붉은 잎색 유지를 위해 밝게 두고, 추운 바람을 오래 맞지 않게 해주세요."},
    {"ko": "싱고니움 알보", "en": "Syngonium Albo", "days": 6, "sunlight": "밝은 간접광", "tip": "무늬를 유지하려면 밝은 곳에서 키우고, 겉흙이 마르면 물을 주세요."},
    {"ko": "싱고니움 핑크 스플래시", "en": "Syngonium Pink Splash", "days": 6, "sunlight": "밝은 간접광", "tip": "분홍 무늬를 위해 밝게 두고, 덩굴이 길어지면 유인해 관리해주세요."},
    {"ko": "칼라디움 화이트퀸", "en": "Caladium White Queen", "days": 5, "sunlight": "밝은 간접광", "tip": "잎이 얇아 건조에 약하므로 흙이 마르기 전에 상태를 확인해주세요."},
    {"ko": "스트로만테 트리오스타", "en": "Stromanthe Triostar", "days": 5, "sunlight": "밝은 간접광", "tip": "잎 끝 마름을 줄이려면 습도를 유지하고, 표토가 마를 때 물을 주세요."},
    {"ko": "칼라테아 오르비폴리아", "en": "Calathea orbifolia", "days": 5, "sunlight": "밝은 간접광", "tip": "넓은 잎이 마르지 않게 흙을 약간 촉촉하게 유지하고, 찬바람은 피해주세요."},
    {"ko": "알로카시아 프라이덱", "en": "Alocasia Frydek", "days": 5, "sunlight": "밝은 간접광", "tip": "생장기에는 흙이 마르기 전에 물을 보충하되, 배수가 나쁘지 않게 해주세요."},
    {"ko": "알로카시아 아마조니카", "en": "Alocasia Amazonica", "days": 5, "sunlight": "밝은 간접광", "tip": "과하게 건조하면 잎이 축 늘어질 수 있으니, 겉흙이 마를 때 물을 주세요."},
    {"ko": "디펜바키아 카밀라", "en": "Dieffenbachia Camilla", "days": 6, "sunlight": "밝은 간접광", "tip": "밝은 무늬를 유지하려면 간접광이 좋고, 흙이 마르면 물을 주세요."},
    {"ko": "드라세나 송 오브 인디아", "en": "Dracaena Song of India", "days": 8, "sunlight": "밝은 간접광", "tip": "노란 무늬가 흐려지지 않게 밝게 두고, 흙이 절반쯤 마르면 물을 주세요."},
    {"ko": "드라세나 콤팩타", "en": "Dracaena Compacta", "days": 8, "sunlight": "밝은 간접광", "tip": "줄기 밑동이 무르지 않게 과습을 피하고, 흙이 마르면 물을 주세요."},
    {"ko": "드라세나 레몬라임", "en": "Dracaena Lemon Lime", "days": 7, "sunlight": "밝은 간접광", "tip": "무늬가 선명하도록 밝게 두고, 잎 끝 갈변이 심하면 수분과 염분을 확인해주세요."},
    {"ko": "아디안텀", "en": "Maidenhair Fern", "days": 4, "sunlight": "반음지", "tip": "작은 잎이 금방 마르므로 흙이 마르지 않게 하고, 습도를 높여주세요."},
    {"ko": "플래티세리움", "en": "Staghorn Fern", "days": 5, "sunlight": "밝은 간접광", "tip": "착생용 배지가 거의 마르면 충분히 적셔주고, 통풍이 잘되게 해주세요."},
    {"ko": "블루스타펀", "en": "Blue Star Fern", "days": 5, "sunlight": "밝은 간접광", "tip": "건조한 바람을 피하고, 흙이 마르기 전에 수분을 보충해주세요."},
    {"ko": "악어고사리", "en": "Crocodile Fern", "days": 5, "sunlight": "밝은 간접광", "tip": "잎 무늬를 건강하게 유지하려면 늘 약간 촉촉한 상태를 유지해주세요."},
    {"ko": "아스파라거스 펀", "en": "Asparagus Fern", "days": 5, "sunlight": "밝은 간접광", "tip": "새순이 부드러워 건조에 약하니 흙이 마르기 전에 물을 주세요."},
    {"ko": "셀라기넬라", "en": "Selaginella", "days": 3, "sunlight": "반음지", "tip": "건조하면 바로 축 처지므로 토양과 공중 습도를 모두 촉촉하게 유지해주세요."},
    {"ko": "접란", "en": "Spider Plant", "days": 6, "sunlight": "밝은 간접광", "tip": "겉흙이 마르면 물을 주고, 갈색 잎끝이 많아지면 물의 염분을 점검해주세요."},
    {"ko": "클로로피텀 보니", "en": "Chlorophytum Bonnie", "days": 6, "sunlight": "밝은 간접광", "tip": "구불거리는 잎을 건강하게 유지하려면 밝은 곳과 규칙적인 물주기가 좋습니다."},
    {"ko": "루도시아 디스컬러", "en": "Ludisia discolor", "days": 5, "sunlight": "밝은 간접광", "tip": "보석란은 건조에 약하니 표토가 마를 때 물을 주고 습도를 유지해주세요."},
    {"ko": "마코데스 페톨라", "en": "Macodes petola", "days": 4, "sunlight": "밝은 간접광", "tip": "벨벳 잎맥이 손상되지 않게 강광을 피하고, 배지가 마르기 전에 수분을 보충해주세요."},
    {"ko": "보석란", "en": "Jewel Orchid", "days": 5, "sunlight": "밝은 간접광", "tip": "잎 감상을 위한 식물이므로 직사광은 피하고, 배지를 촉촉하게 유지해주세요."},
    {"ko": "바닐라 오키드", "en": "Vanilla Orchid", "days": 5, "sunlight": "밝은 간접광", "tip": "덩굴성 난초라 지지대를 세워주고, 배지가 거의 마를 때 물을 주세요."},
    {"ko": "밀토니아", "en": "Miltonia", "days": 5, "sunlight": "밝은 간접광", "tip": "배지가 너무 마르면 벌브가 쪼글해지므로, 마르기 전에 상태를 확인해주세요."},
    {"ko": "온시디움", "en": "Oncidium Orchid", "days": 6, "sunlight": "밝은 간접광", "tip": "꽃대가 올라올 때 수분이 부족하지 않게 하고, 배수가 잘되는 상태를 유지해주세요."},
    {"ko": "반다", "en": "Vanda Orchid", "days": 4, "sunlight": "밝은 곳", "tip": "뿌리가 굵고 공중에 노출되는 경우가 많아, 자주 적셔주되 오래 축축하게 두지 마세요."},
    {"ko": "파피오페딜룸", "en": "Paphiopedilum", "days": 5, "sunlight": "밝은 간접광", "tip": "구근이 없어 완전히 마르면 힘들어하니, 배지가 마르기 전에 물을 주세요."},
    {"ko": "지고페탈룸", "en": "Zygopetalum", "days": 5, "sunlight": "밝은 간접광", "tip": "향기로운 꽃을 위해 통풍을 챙기고, 배지가 거의 마를 때 물을 주세요."},
    {"ko": "무스카리", "en": "Muscari", "days": 4, "sunlight": "밝은 곳", "tip": "구근이 자랄 때는 흙이 너무 마르지 않게 하고, 꽃이 진 뒤에는 점차 물을 줄여주세요."},
    {"ko": "수선화", "en": "Daffodil", "days": 4, "sunlight": "밝은 곳", "tip": "꽃대가 오르는 동안 흙이 마르면 바로 물을 주고, 개화 후에는 과습을 피해주세요."},
    {"ko": "히아신스", "en": "Hyacinth", "days": 4, "sunlight": "밝은 곳", "tip": "향이 좋은 꽃을 오래 보려면 서늘하게 두고, 구근이 마르지 않을 만큼만 물을 주세요."},
    {"ko": "아이리스", "en": "Iris", "days": 5, "sunlight": "햇빛 필요", "tip": "햇빛을 충분히 보여주고, 생장기에는 흙이 완전히 마르지 않게 관리해주세요."},
    {"ko": "프리뮬라", "en": "Primula", "days": 4, "sunlight": "밝은 간접광", "tip": "서늘한 환경에서 흙이 마르기 전에 물을 주면 꽃을 좀 더 오래 볼 수 있습니다."},
    {"ko": "캄파눌라", "en": "Campanula", "days": 4, "sunlight": "밝은 곳", "tip": "꽃이 많은 시기에는 수분 소모가 크니, 겉흙이 마르면 바로 물을 주세요."},
    {"ko": "라일락", "en": "Lilac", "days": 6, "sunlight": "햇빛 필요", "tip": "햇빛과 통풍이 좋아야 꽃눈이 잘 생기므로, 흙이 마르면 깊게 물을 주세요."},
    {"ko": "스위트피", "en": "Sweet Pea", "days": 4, "sunlight": "밝은 곳", "tip": "꽃이 연속해서 피도록 흙이 마르기 전에 물을 주고, 시든 꽃은 빨리 제거해주세요."},
    {"ko": "코스모스", "en": "Cosmos", "days": 5, "sunlight": "햇빛 필요", "tip": "햇빛이 충분하면 꽃이 잘 피고, 흙이 마르면 물을 주는 정도가 적당합니다."},
    {"ko": "접시꽃", "en": "Hollyhock", "days": 5, "sunlight": "햇빛 필요", "tip": "키가 커지므로 흙이 너무 마르지 않게 하고, 바람이 강한 곳은 지지해 주세요."},
    {"ko": "델피니움", "en": "Delphinium", "days": 4, "sunlight": "밝은 곳", "tip": "서늘한 환경을 좋아하니 흙이 마르기 전에 물을 주고, 꽃대는 지지해주세요."},
    {"ko": "루피너스", "en": "Lupine", "days": 5, "sunlight": "햇빛 필요", "tip": "토양이 너무 건조하지 않게 유지하고, 더위가 심한 시기엔 수분 상태를 자주 봐주세요."},
    {"ko": "헬레보루스", "en": "Hellebore", "days": 5, "sunlight": "밝은 간접광", "tip": "반그늘에서 흙이 지나치게 마르지 않게 관리하면 잎과 꽃 상태가 안정적입니다."},
    {"ko": "에키네시아", "en": "Coneflower", "days": 6, "sunlight": "햇빛 필요", "tip": "뿌리가 자리 잡은 뒤엔 비교적 건조에 강하지만, 완전히 시들기 전 물을 주세요."},
    {"ko": "살비아 파리나세아", "en": "Mealycup Sage", "days": 5, "sunlight": "햇빛 필요", "tip": "꽃대가 길게 이어지도록 햇빛을 충분히 받고, 흙이 마르면 물을 주세요."},
    {"ko": "버베나", "en": "Verbena", "days": 4, "sunlight": "햇빛 필요", "tip": "개화량이 많아 흙이 마르면 바로 물을 주고, 시든 꽃은 자주 정리해주세요."},
    {"ko": "가자니아", "en": "Gazania", "days": 5, "sunlight": "햇빛 필요", "tip": "햇빛이 강할수록 꽃이 잘 열리며, 흙이 마르면 물을 주는 정도가 좋습니다."},
    {"ko": "페라고늄", "en": "Pelargonium", "days": 5, "sunlight": "햇빛 필요", "tip": "잎과 줄기가 지나치게 무성해지지 않도록 밝게 두고, 겉흙이 마르면 물을 주세요."},
    {"ko": "브라키컴", "en": "Brachyscome", "days": 4, "sunlight": "밝은 곳", "tip": "잔꽃이 오래 피도록 흙이 마르기 전에 물을 주고, 시든 꽃은 정리해주세요."},
    {"ko": "디아스시아", "en": "Diascia", "days": 4, "sunlight": "밝은 곳", "tip": "서늘한 환경에서 꽃이 오래가므로, 건조해지기 전에 물을 보충해주세요."},
    {"ko": "네메시아", "en": "Nemesia", "days": 4, "sunlight": "밝은 곳", "tip": "더위에 약하니 한낮 강광은 피하고, 흙이 마르기 전에 물을 주세요."},
    {"ko": "스카비오사", "en": "Scabiosa", "days": 5, "sunlight": "햇빛 필요", "tip": "개화 중에는 흙이 완전히 마르지 않게 관리하고, 꽃대는 자주 정리해주세요."},
    {"ko": "아스틸베", "en": "Astilbe", "days": 4, "sunlight": "밝은 간접광", "tip": "건조에 약하므로 반그늘에서 흙을 꾸준히 촉촉하게 유지해주세요."},
    {"ko": "숙근안개초", "en": "Perennial Baby's Breath", "days": 6, "sunlight": "햇빛 필요", "tip": "과습보다는 약간 건조한 쪽이 좋으니 흙이 마른 뒤 물을 주세요."},
    {"ko": "시네라리아", "en": "Florist's Cineraria", "days": 4, "sunlight": "밝은 간접광", "tip": "서늘한 곳에서 흙이 마르기 전에 물을 주면 꽃을 더 오래 볼 수 있습니다."},
    {"ko": "아라비안 자스민", "en": "Arabian Jasmine", "days": 5, "sunlight": "밝은 곳", "tip": "향기로운 꽃을 위해 빛을 확보하고, 생장기에는 흙이 마르기 전에 물을 주세요."},
    {"ko": "스테파노티스", "en": "Stephanotis", "days": 5, "sunlight": "밝은 간접광", "tip": "꽃봉오리가 떨어지지 않게 환경 변화를 줄이고, 흙이 마르면 물을 주세요."},
    {"ko": "클레로덴드럼 톰소니애", "en": "Bleeding Heart Vine", "days": 5, "sunlight": "밝은 곳", "tip": "덩굴이 왕성하게 자라므로 지지대를 세우고, 흙이 마르면 충분히 물을 주세요."},
    {"ko": "수박페페", "en": "Watermelon Pilea", "days": 6, "sunlight": "밝은 간접광", "tip": "작은 잎이 쉽게 처질 수 있으니 표토가 마를 때 물을 주세요."},
    {"ko": "필레아 글라우카", "en": "Pilea glauca", "days": 5, "sunlight": "밝은 간접광", "tip": "가느다란 줄기가 마르지 않게 관리하고, 흙이 마르기 전에 가볍게 물을 주세요."},
    {"ko": "필레아 카디에레이", "en": "Aluminum Plant", "days": 5, "sunlight": "밝은 간접광", "tip": "은색 무늬를 유지하려면 밝게 두고, 흙이 마르면 물을 주세요."},
    {"ko": "트라데스칸티아 제브리나", "en": "Tradescantia zebrina", "days": 5, "sunlight": "밝은 간접광", "tip": "줄기가 웃자라지 않게 밝은 곳에 두고, 겉흙이 마르면 물을 주세요."},
    {"ko": "네오레겔리아", "en": "Neoregelia", "days": 6, "sunlight": "밝은 간접광", "tip": "로제트 중앙에 깨끗한 물을 얕게 두고, 오래된 물은 주기적으로 갈아주세요."},
    {"ko": "브리에시아", "en": "Vriesea", "days": 6, "sunlight": "밝은 간접광", "tip": "통풍을 유지하며 잎통 안의 물을 정기적으로 교체해 주세요."},
    {"ko": "틸란드시아 이오난사", "en": "Tillandsia ionantha", "days": 4, "sunlight": "밝은 간접광", "tip": "짧게 담가 수분을 보충한 뒤 반드시 완전히 말려주세요."},
    {"ko": "틸란드시아 크세로그라피카", "en": "Tillandsia xerographica", "days": 5, "sunlight": "밝은 간접광", "tip": "잎 사이 통풍이 중요하니 물 준 뒤에는 거꾸로 말려주세요."},
    {"ko": "클리비아", "en": "Clivia", "days": 7, "sunlight": "밝은 간접광", "tip": "잎만 무성해지지 않게 겨울에는 물주기를 조금 줄이고, 꽃대가 오르면 다시 늘려주세요."},
    {"ko": "아마릴리스", "en": "Amaryllis", "days": 5, "sunlight": "밝은 곳", "tip": "꽃대가 자랄 때 흙이 너무 마르지 않게 하고, 구근이 무르지 않게 배수를 챙겨주세요."},
    {"ko": "글록시니아", "en": "Gloxinia", "days": 4, "sunlight": "밝은 간접광", "tip": "잎과 꽃에 직접 물이 오래 닿지 않게 하고, 흙이 마르기 전에 물을 주세요."},
    {"ko": "아프리칸 바이올렛", "en": "African Violet", "days": 4, "sunlight": "밝은 간접광", "tip": "잎에 물방울이 오래 남지 않게 하고, 화분 가장자리로 물을 주세요."},
    {"ko": "콜레리아", "en": "Kohleria", "days": 4, "sunlight": "밝은 간접광", "tip": "꽃이 이어질 때는 흙이 마르기 전에 물을 주고, 겨울엔 물을 줄여주세요."},
    {"ko": "파키스타키스", "en": "Golden Shrimp Plant", "days": 5, "sunlight": "밝은 간접광", "tip": "꽃 포엽을 오래 보려면 흙이 마르면 바로 물을 주고, 습도를 약간 유지해주세요."},
    {"ko": "에스키난서스", "en": "Lipstick Plant", "days": 6, "sunlight": "밝은 간접광", "tip": "덩굴 끝 꽃눈을 위해 밝게 두고, 흙이 거의 마르면 물을 주세요."},
    {"ko": "콜룸네아", "en": "Goldfish Plant", "days": 6, "sunlight": "밝은 간접광", "tip": "꽃을 보기 위해 밝은 곳과 약간의 습도가 필요하며, 겉흙이 마르면 물을 주세요."},
    {"ko": "펜타스", "en": "Pentas", "days": 5, "sunlight": "햇빛 필요", "tip": "햇빛이 충분해야 꽃이 잘 피고, 흙이 마르면 바로 물을 주세요."},
    {"ko": "란타나", "en": "Lantana", "days": 6, "sunlight": "햇빛 필요", "tip": "강한 빛에서 꽃이 풍성해지므로 햇빛을 확보하고, 흙이 마르면 물을 주세요."},
    {"ko": "토레니아 카우아이", "en": "Torenia Kauai", "days": 4, "sunlight": "밝은 간접광", "tip": "여름철 건조에 약하니 흙이 마르기 전에 물을 보충해주세요."},
    {"ko": "로벨리아 리차르디", "en": "Trailing Lobelia", "days": 4, "sunlight": "밝은 곳", "tip": "서늘한 환경을 좋아하므로 더운 시기에는 마르기 전에 물을 주세요."},
    {"ko": "옥살리스 트라이앵귤라리스", "en": "Purple Shamrock Triangularis", "days": 5, "sunlight": "밝은 간접광", "tip": "잎이 접히는 리듬을 보며 관리하고, 흙이 마르면 물을 주세요."},
    {"ko": "헤데라 글레이셔", "en": "Hedera Glacier", "days": 6, "sunlight": "밝은 간접광", "tip": "무늬가 선명하게 유지되도록 밝게 두고, 흙이 마르면 물을 주세요."},
    {"ko": "크리핑 피그", "en": "Creeping Fig", "days": 5, "sunlight": "밝은 간접광", "tip": "작은 잎이 촘촘해 건조를 싫어하니 흙이 마르기 전에 가볍게 물을 주세요."},
    {"ko": "페페로미아 프로스트", "en": "Peperomia Frost", "days": 7, "sunlight": "밝은 간접광", "tip": "잎 결이 상하지 않게 과습을 피하고, 흙이 마르면 물을 주세요."},
    {"ko": "칼리시아 레펜스", "en": "Callisia repens", "days": 5, "sunlight": "밝은 간접광", "tip": "줄기가 가늘어 건조에 약하니 겉흙이 마를 때 물을 주세요."},
    {"ko": "프테리스 고사리", "en": "Pteris Fern", "days": 4, "sunlight": "반음지", "tip": "섬세한 잎이 마르지 않게 흙을 늘 약간 촉촉하게 유지해주세요."},
    {"ko": "헤미그래피스", "en": "Purple Waffle Plant", "days": 5, "sunlight": "밝은 간접광", "tip": "보라빛 잎색을 위해 밝은 간접광이 좋고, 흙이 마르면 물을 주세요."},
    {"ko": "솔레이롤리아", "en": "Baby's Tears", "days": 3, "sunlight": "밝은 간접광", "tip": "아주 잘 마르므로 토양이 건조해지기 전에 자주 상태를 확인해주세요."},
]


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description="Add 100 more unique plant reminder presets.")
    parser.add_argument("--env-file", default=str(DEFAULT_ENV_PATH))
    parser.add_argument("--limit", type=int, default=100)
    parser.add_argument("--dry-run", action="store_true")
    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():
        line = line.strip()
        if not line or line.startswith("#") or "=" not in line:
            continue
        key, value = line.split("=", 1)
        os.environ.setdefault(key.strip(), value.strip())


def create_db_connection():
    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",
    )


_TRANSLATION_CACHE: dict[tuple[str, str], str] = {}


def translate_text(text: str, target_lang: str, source_lang: str = "auto", attempt: int = 1) -> str:
    if not text:
        return ""
    key = (text, target_lang, source_lang)
    if key in _TRANSLATION_CACHE:
        return _TRANSLATION_CACHE[key]
    url = (
        "https://translate.googleapis.com/translate_a/single"
        f"?client=gtx&sl={quote(source_lang)}&tl={quote(target_lang)}&dt=t&q={quote(text)}"
    )
    req = Request(url, headers={"User-Agent": "Codex Plant Seeder/1.0"})
    try:
        with urlopen(req, timeout=30) as response:
            data = json.loads(response.read().decode("utf-8"))
    except (HTTPError, URLError):
        if attempt >= 5:
            raise
        time.sleep(attempt * 2)
        return translate_text(text, target_lang, source_lang=source_lang, attempt=attempt + 1)
    translated = "".join(part[0] for part in data[0] if part and part[0])
    _TRANSLATION_CACHE[key] = translated
    time.sleep(0.15)
    return translated


def build_row(item: dict, sort_order: int) -> dict:
    ko_name = item["ko"].strip()
    sunlight_ko = item["sunlight"].strip()
    tip_ko = item["tip"].strip()
    return {
        "type_name": ko_name,
        "type_name_ko": ko_name,
        "type_name_en": item["en"].strip(),
        "type_name_ja": translate_text(item["en"].strip(), "ja", source_lang="en"),
        "type_name_zh": translate_text(item["en"].strip(), "zh-CN", source_lang="en"),
        "watering_cycle_days": int(item["days"]),
        "sunlight": sunlight_ko,
        "sunlight_ko": sunlight_ko,
        "sunlight_en": translate_text(sunlight_ko, "en", source_lang="ko"),
        "sunlight_ja": translate_text(sunlight_ko, "ja", source_lang="ko"),
        "sunlight_zh": translate_text(sunlight_ko, "zh-CN", source_lang="ko"),
        "tip": tip_ko,
        "tip_ko": tip_ko,
        "tip_en": translate_text(tip_ko, "en", source_lang="ko"),
        "tip_ja": translate_text(tip_ko, "ja", source_lang="ko"),
        "tip_zh": translate_text(tip_ko, "zh-CN", source_lang="ko"),
        "image_url": "",
        "image_path": "",
        "is_active": 1,
        "sort_order": sort_order,
    }


def insert_row(cursor, row: dict) -> None:
    cursor.execute(
        """
        INSERT INTO plant_reminder_presets (
          type_name, type_name_ko, type_name_en, type_name_ja, type_name_zh,
          watering_cycle_days,
          sunlight, sunlight_ko, sunlight_en, sunlight_ja, sunlight_zh,
          tip, tip_ko, tip_en, tip_ja, tip_zh,
          image_url, image_path, is_active, sort_order
        ) VALUES (
          %(type_name)s, %(type_name_ko)s, %(type_name_en)s, %(type_name_ja)s, %(type_name_zh)s,
          %(watering_cycle_days)s,
          %(sunlight)s, %(sunlight_ko)s, %(sunlight_en)s, %(sunlight_ja)s, %(sunlight_zh)s,
          %(tip)s, %(tip_ko)s, %(tip_en)s, %(tip_ja)s, %(tip_zh)s,
          %(image_url)s, %(image_path)s, %(is_active)s, %(sort_order)s
        )
        """,
        row,
    )


def main() -> None:
    args = parse_args()
    load_env(args.env_file)

    if len({item["ko"] for item in CANDIDATES}) != len(CANDIDATES):
        raise RuntimeError("CANDIDATES contains duplicate Korean names.")

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

    try:
        cursor.execute("SELECT type_name FROM plant_reminder_presets")
        existing_names = {row["type_name"] for row in cursor.fetchall()}

        cursor.execute("SELECT COALESCE(MAX(sort_order), 0) AS max_sort_order FROM plant_reminder_presets")
        sort_order = int(cursor.fetchone()["max_sort_order"] or 0) + 1

        inserted = 0
        skipped_existing = 0

        for item in CANDIDATES:
            if inserted >= args.limit:
                break
            if item["ko"] in existing_names:
                skipped_existing += 1
                continue

            row = build_row(item, sort_order)
            if args.dry_run:
                print(f"[dry-run] {row['type_name']}")
            else:
                insert_row(cursor, row)
                conn.commit()
                print(f"[inserted] {row['type_name']}")

            existing_names.add(item["ko"])
            inserted += 1
            sort_order += 1

        print(json.dumps({
            "requested_limit": args.limit,
            "candidate_count": len(CANDIDATES),
            "inserted": inserted,
            "skipped_existing": skipped_existing,
            "next_sort_order": sort_order,
            "dry_run": args.dry_run,
        }, ensure_ascii=False, indent=2))
    finally:
        cursor.close()
        conn.close()


if __name__ == "__main__":
    main()
