#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Zhantai merchant platform CLI. Python 3.8+, standard library only."""
import argparse,json,os,sys,uuid,urllib.request,urllib.error

def main():
 p=argparse.ArgumentParser(description='站台商家 CLI：查门店、看菜单、订位请求和意见跟进。订位需商家确认。')
 p.add_argument('--base-url',default=os.environ.get('ZHANTAI_BASE_URL','https://agent.zhantaiyingxiao.cn'))
 sub=p.add_subparsers(dest='command',required=True)
 s=sub.add_parser('search');s.add_argument('query',nargs='?',default='')
 s=sub.add_parser('menu');s.add_argument('merchant_id')
 s=sub.add_parser('slots');s.add_argument('merchant_id');s.add_argument('date')
 s=sub.add_parser('book');s.add_argument('merchant_id');s.add_argument('--slot',required=True);s.add_argument('--party-size',type=int,required=True);s.add_argument('--name',required=True);s.add_argument('--contact',required=True);s.add_argument('--request-id',default=None);s.add_argument('--consent',action='store_true',help='确认顾客授权将姓名、联系方式与订位信息发送给该商家')
 s=sub.add_parser('feedback');s.add_argument('merchant_id');s.add_argument('--category',choices=['dish','service','other'],required=True);s.add_argument('--stage',choices=['during','after'],required=True);s.add_argument('--subject',required=True);s.add_argument('--body',required=True);s.add_argument('--contact',default='');s.add_argument('--consent',action='store_true')
 s=sub.add_parser('track');s.add_argument('id');s.add_argument('--kind',choices=['reservation','feedback'],required=True)
 s=sub.add_parser('reply');s.add_argument('id');s.add_argument('--body',required=True);s.add_argument('--consent',action='store_true')
 sub.add_parser('owner')
 a=p.parse_args();base=a.base_url.rstrip('/')
 if not base.startswith(('https://','http://127.0.0.1:','http://localhost:')):p.error('仅允许 HTTPS 服务或本机开发地址')
 method='GET';data=None;token=''
 from urllib.parse import quote,urlencode
 if a.command=='search':path='/api/merchants?'+urlencode({'q':a.query})
 elif a.command=='menu':path='/api/merchants/'+quote(a.merchant_id,safe='')
 elif a.command=='slots':path='/api/merchants/'+quote(a.merchant_id,safe='')+'/slots?'+urlencode({'date':a.date})
 elif a.command=='book':
  if not a.consent:p.error('请先取得顾客授权，再添加 --consent')
  path='/api/reservations';method='POST';data={'merchant_id':a.merchant_id,'slot':a.slot,'party_size':a.party_size,'name':a.name,'contact':a.contact,'request_id':a.request_id or str(uuid.uuid4()),'consent':True}
  print('request_id='+data['request_id']+'（重试时复用此编号）',file=sys.stderr)
 elif a.command=='feedback':
  if not a.consent:p.error('请先取得顾客授权，再添加 --consent')
  path='/api/feedback';method='POST';data={k:getattr(a,k) for k in ['merchant_id','category','stage','subject','body','contact','consent']}
 elif a.command=='track':path='/api/'+('reservations' if a.kind=='reservation' else 'feedback')+'/'+quote(a.id,safe='');token=os.environ.get('ZHANTAI_CUSTOMER_TOKEN','')
 elif a.command=='reply':
  if not a.consent:p.error('请先取得顾客授权，再添加 --consent')
  path='/api/feedback/'+quote(a.id,safe='')+'/messages';method='POST';data={'body':a.body};token=os.environ.get('ZHANTAI_CUSTOMER_TOKEN','')
 else:path='/api/owner';token=os.environ.get('ZHANTAI_OWNER_TOKEN','')
 if a.command in ('track','reply','owner') and not token:p.error('请通过 ZHANTAI_CUSTOMER_TOKEN 或 ZHANTAI_OWNER_TOKEN 环境变量提供相应凭证')
 headers={'Accept':'application/json','User-Agent':'Zhantai-CLI/0.1.0'}
 if data is not None:headers['Content-Type']='application/json'
 if token:headers['Authorization']='Bearer '+token
 req=urllib.request.Request(base+path,data=json.dumps(data,ensure_ascii=False).encode() if data is not None else None,method=method,headers=headers)
 try:
  with urllib.request.urlopen(req,timeout=20) as r:result=json.load(r)
  print(json.dumps(result,ensure_ascii=False,indent=2))
 except urllib.error.HTTPError as e:
  print(e.read().decode('utf-8','replace'),file=sys.stderr);sys.exit(1)
 except (OSError,ValueError) as e:print('请求失败：'+str(e),file=sys.stderr);sys.exit(1)

if __name__=='__main__':main()
