# -*- coding: utf-8 -*-
"""
K3Cloud WebAPI Python 客户端骨架
语言：Python (requests + Session)
覆盖：登录/查询/查看/保存/删除/提交/审核/反审核/下推/自定义操作
依赖：pip install requests

使用说明：
1. 替换 SERVER_URL / ACCT_ID / APP_ID / APP_SECRET 为实际值
2. 首次调用 login() 建立会话，后续请求自动携带 Cookie
3. K3CloudApiSdk 非线程安全，并发场景用单线程 executor 序列化
"""
import json
import requests


class K3CloudClient:
    """K3Cloud WebAPI 客户端（基于 requests.Session）"""

    def __init__(self, server_url):
        """
        :param server_url: 金蝶服务器地址，以 /k3cloud/ 结尾
        """
        self.server_url = server_url
        self.session = requests.Session()
        self._logged_in = False

    def _post(self, service_name, *args):
        """内部：POST 请求"""
        url = f"{self.server_url}{service_name}.common.kdsvc"
        resp = self.session.post(url, json=list(args))
        return json.loads(resp.text)

    def login_by_app_secret(self, acct_id, app_id, app_secret, lcid=2052):
        """应用授权登录（推荐，第三方对接）"""
        result = self._post(
            "Kingdee.BOS.WebApi.ServicesStub.AuthService.LoginByAppSecret",
            acct_id, app_id, app_secret, lcid
        )
        if result.get("LoginResultType") == 1:
            self._logged_in = True
        return result

    def login_by_user(self, dbid, user_name, password, lcid=2052):
        """用户密码登录"""
        result = self._post(
            "Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser",
            dbid, user_name, password, lcid
        )
        if result.get("LoginResultType") == 1:
            self._logged_in = True
        return result

    def execute_bill_query(self, form_id, field_keys, filter_string=None, start_row=0, limit=0):
        """单据查询（返回二维数组）"""
        data = {
            "FormId": form_id,
            "FieldKeys": field_keys,
            "FilterString": filter_string or "",
            "StartRow": start_row,
            "Limit": limit,
        }
        return self._post(
            "Kingdee.BOS.WebApi.ServicesStub.BusinessDataService.ExecuteBillQuery",
            data
        )

    def view(self, form_id, key_value):
        """查看单据详情"""
        data = {"CreateOrgId": 0, "Number": "", "Id": key_value}
        return self._post(
            "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.View",
            form_id, json.dumps(data)
        )

    def save(self, form_id, model, is_delete_entry="true"):
        """保存单据"""
        data = {
            "Model": model,
            "IsDeleteEntry": is_delete_entry,
            "ValidateFlag": "true",
            "NumberSearch": "true",
        }
        return self._post(
            "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save",
            form_id, json.dumps(data)
        )

    def delete(self, form_id, key_values):
        """删除单据"""
        data = {"CreateOrgId": 0, "Numbers": "", "Ids": ",".join(str(v) for v in key_values)}
        return self._post(
            "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Delete",
            form_id, json.dumps(data)
        )

    def submit(self, form_id, key_values):
        """提交单据"""
        data = {"CreateOrgId": 0, "Numbers": "", "Ids": ",".join(str(v) for v in key_values)}
        return self._post(
            "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Submit",
            form_id, json.dumps(data)
        )

    def audit(self, form_id, key_values):
        """审核单据"""
        data = {"CreateOrgId": 0, "Numbers": "", "Ids": ",".join(str(v) for v in key_values)}
        return self._post(
            "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit",
            form_id, json.dumps(data)
        )

    def unaudit(self, form_id, key_values):
        """反审核单据"""
        data = {"CreateOrgId": 0, "Numbers": "", "Ids": ",".join(str(v) for v in key_values)}
        return self._post(
            "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.UnAudit",
            form_id, json.dumps(data)
        )

    def push(self, form_id, push_args):
        """下推单据"""
        data = {"Ids": "", "RuleId": "", "TargetFormId": form_id, "IsEnableDefaultRule": "true", "CustomParams": push_args}
        return self._post(
            "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Push",
            json.dumps(data)
        )

    def execute_operation(self, form_id, op_number, key_values):
        """执行自定义操作"""
        data = {"CreateOrgId": 0, "Numbers": "", "Ids": ",".join(str(v) for v in key_values)}
        return self._post(
            "Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExcuteOperation",
            form_id, op_number, json.dumps(data)
        )
