"""Official work-list validation; never infer capacity or stable slot identity."""
import math

from ..content import read
from .contracts import require, integer, exact

# Official get_alterable_items, 2026-09-17, compared with the authored material
# variants. These are command identities; keep the UI's unqualified titles.
ALTERING_NAMES={
    'medicine-light-ghost':'광휘의 결정(유령 반딧불이)',
    'medicine-fire':'불꽃의 결정(석양나비)',
    'medicine-ice':'얼음의 결정(흰얼음풍뎅이)',
    'medicine-lightning':'전기의 결정(낙엽나방)',
    'medicine-seal':'봉인의 결정(황혼잠자리)',
    'medicine-light-stag':'광휘의 결정(달무늬 사슴벌레)',
}


def altering_name(recipe):return ALTERING_NAMES.get(recipe['id'],recipe['name'])


def altering_candidates(view,recipe):
    require(isinstance(view,dict) and isinstance(view.get('items'),list),'공식 가공 레시피 목록 형식 변경')
    require(all(isinstance(row,dict) and isinstance(row.get('DisplayName'),str) for row in view['items']),'공식 가공 레시피 행 형식 변경')
    return [row for row in view['items'] if row['DisplayName']==altering_name(recipe)]


def works(view):
    require(isinstance(view,dict) and isinstance(view.get('works'),list),'공식 가공 작업 목록 형식 변경')
    rows=view['works']
    for row in rows:
        require(isinstance(row,dict),'공식 가공 작업 행 형식 변경')
        require(all(isinstance(row.get(k),str) and row[k] for k in ('DisplayName','FacilityName')),'가공 품목/시설 이름 확인 필요')
        require(row.get('State') in ('NotStarted','InProgress','Completed'),'공식 가공 상태 변경')
        require(type(row.get('IsCompleted')) is bool,'공식 가공 완료 여부 확인 필요')
        exact(row['IsCompleted'],row['State']=='Completed','공식 가공 완료 상태')
        remaining=row.get('RemainingSeconds')
        require(type(remaining) in (int,float) and math.isfinite(remaining) and remaining>=0,'가공 잔여 시간 확인 필요')
        if row['IsCompleted']:exact(remaining,0,'완료 가공 잔여 시간')
    exact(integer(view.get('completedCount'),'공식 완료 가공 개수'),sum(row['IsCompleted'] for row in rows),'공식 가공 완료 합계')
    return rows


def facility_works(view,group):
    catalog=read('processing_catalog.json')
    require(group in {g['id'] for g in catalog['groups']},'가공 분야 확인 필요')
    names={altering_name(r) for r in catalog['recipes'] if r['group']==group}
    all_names={altering_name(r) for r in catalog['recipes']}
    rows=works(view)
    facilities={r['FacilityName'] for r in rows if r['DisplayName'] in names}
    require(len(facilities)<=1,'같은 가공 분야의 시설이 여러 개입니다. 임의로 수령하지 않습니다.')
    if not facilities:
        # An unknown recipe might be the ONLY work at the requested facility.
        # Its absence from an older catalog cannot prove an empty queue.
        require(all(r['DisplayName'] in all_names for r in rows),'미등록 가공품의 시설 연결 확인 필요')
        return []
    facility=next(iter(facilities))
    selected=[r for r in rows if r['FacilityName']==facility]
    require(all(r['DisplayName'] in names for r in selected),'요청 가공 분야와 공식 시설의 품목 범위 불일치')
    return selected


def collection_name(rows):
    completed=[r for r in rows if r['IsCompleted']]
    if not completed:return None
    busy={r['DisplayName'] for r in rows if not r['IsCompleted']}
    ready=[r for r in completed if r['DisplayName'] not in busy]
    require(ready,'같은 이름의 가공이 진행 중입니다. 완료 후 수령해야 합니다. 추가 등록/수령 명령은 보내지 않습니다.')
    return ready[0]['DisplayName']
