import Chat from "@/customer-service/xim";
import { metaRow, UniplatSdkExtender, UniplatSdk } from "uniplat-sdk";
import {
    OperationType,
    OrderStatus,
    OrderTableListItem,
    orderPredict,
    SrcPlatform,
    OrderPayItem,
    UploadImageItem,
    orderPayItemPredict,
    OrderComment,
    PayStatus,
} from "../model";
import { GeneralOrderDirection } from "../model/order-product";

class OrderService {
    public readonly generalOrder = "general_order_info";
    public readonly generalOrderPaymentModel = "general_order_payment_info";
    public readonly generalOrderDefaultDetailName = "userOrderDetail";
    private readonly commentModel = "uniplat_model_remark@general_order";
    private readonly fileModel = "general_order_payment_file_info";

    private readonly handler = new UniplatSdkExtender();
    private innerSdk: UniplatSdk | null = null;

    public injectSdk(sdk: UniplatSdk) {
        this.innerSdk = sdk;
        return this;
    }

    private getSdk() {
        return this.innerSdk || Chat.getSdk();
    }

    public openOrder(params: {
        productCode: string;
        srcPlatform: SrcPlatform;
        createdType: OperationType;
        /**
         * 是否强制开启新订单,默认如果有已存在处理中的订单时会直接返回
         */
        forceNewOrder?: boolean;
    }) {
        return this.getSdk()
            .model(this.generalOrder)
            .action(params.forceNewOrder ? "addOrder" : "getOrAddOrder")
            .addInputs_parameter({
                ProductCode: params.productCode,
                SrcPlatform: params.srcPlatform,
                CreatedType: params.createdType,
            })
            .execute();
    }

    public updateOrderStatus(
        id: number | string,
        v: number,
        status: OrderStatus
    ) {
        return this.getSdk()
            .model(this.generalOrder)
            .action("editStatus")
            .addInputs_parameter({
                Status: status,
                userType: OperationType.User,
            })
            .updateInitialParams({ selected_list: [{ v, id: +id }] })
            .execute();
    }

    /** 专项工单 */
    public getOrders(
        params: {
            productCode?: GeneralOrderDirection;
            index: number;
            size?: number;
        },
        isHrs = false
    ) {
        const list = this.getSdk()
            .model(this.generalOrder)
            .list(isHrs ? "hroOrgOrderList" : "userOrderList");
        if (params.productCode) {
            list.addPrefilter({ "ProductId#product.Code": params.productCode });
        }
        return list
            .query({ item_size: params.size || 100, pageIndex: params.index })
            .then((r) => {
                return {
                    total: r.pageData.record_count,
                    list: this.handler.buildRows<OrderTableListItem>(
                        r.pageData.rows,
                        orderPredict
                    ),
                };
            });
    }

    public getProcessOrders(params: {
        productCode?: GeneralOrderDirection;
        index: number;
        size?: number;
    }) {
        const list = this.getSdk()
            .model(this.generalOrder)
            .list("hroOrgDoingOrderList");
        if (params.productCode) {
            list.addPrefilter({ "ProductId#product.Code": params.productCode });
        }
        return list
            .query({ item_size: params.size || 100, pageIndex: params.index })
            .then((r) => {
                return {
                    total: r.pageData.record_count,
                    list: this.handler.buildRows<OrderTableListItem>(
                        r.pageData.rows,
                        orderPredict
                    ),
                };
            });
    }

    /**
     * 获取订单支付记录
     * @param id 订单id
     * @param withActions 是否获取行数据中action条目
     */
    public getPayments(id: number, withActions = false) {
        return this.getSdk()
            .model(orderService.generalOrderPaymentModel)
            .list(withActions ? "" : "userOrderPaymentList")
            .addPrefilter({ OrderId: id })
            .query({ pageIndex: 1, item_size: 100 })
            .then((r) => {
                if (r && r.pageData && r.pageData.rows) {
                    let items = this.handler.buildRows<OrderPayItem>(
                        r.pageData.rows,
                        orderPayItemPredict
                    );
                    items = items.filter(
                        (i) =>
                            i.status !== PayStatus.Deleted &&
                            i.status !== PayStatus.Cancel
                    );
                    if (withActions) {
                        for (let i = 0; i < r.pageData.rows.length; i++) {
                            r.pageData &&
                                r.pageData.rows &&
                                r.pageData.rows[i] &&
                                (items[i].actions = r.pageData.rows[i].actions);
                        }
                    }

                    return items;
                }
                return [];
            });
    }

    public getPayment(id: string | number) {
        return this.getSdk()
            .model(orderService.generalOrderPaymentModel)
            .detail(id as string, "userOrderPaymentDetail")
            .query()
            .then((r) =>
                this.handler.buildRow<OrderPayItem>(r.row, orderPayItemPredict)
            );
    }

    public addImage4Payment(payment: number | string, v: number, path: string) {
        return this.getSdk()
            .model(orderService.generalOrderPaymentModel)
            .action("addImages")
            .updateInitialParams({
                selected_list: [{ v, id: payment as number }],
            })
            .addInputs_parameter({ images: path })
            .execute();
    }

    public getImages4Payment(payment: number) {
        return this.getSdk()
            .model(this.fileModel)
            .list()
            .addPrefilter({ PaymentId: payment })
            .query({ item_size: 10, pageIndex: 1 })
            .then((r) =>
                this.handler.buildRows<UploadImageItem>(r.pageData.rows, {
                    time: "CreatedDate",
                    fileSize: "FileSize",
                    fileName: "FileName",
                    url: "Url",
                    id: "ID",
                    v: "uniplat_version",
                })
            );
    }

    public deleteImage(payment: number, image: number, v: number) {
        return this.getSdk()
            .model(this.fileModel)
            .action("delete")
            .updateInitialParams({
                selected_list: [{ v, id: image }],
                prefilters: [{ property: "PaymentId", value: payment }],
            })
            .execute();
    }

    public buildOrder(o: metaRow) {
        return this.handler.buildRow<OrderTableListItem>(o, orderPredict);
    }

    /** 设置备注 */
    public setRemark(
        id: string,
        v: number,
        data: { Title: string; Remark: string }
    ) {
        return this.getSdk()
            .model(this.generalOrder)
            .action("editTitle")
            .updateInitialParams({ selected_list: [{ v, id: +id }] })
            .addInputs_parameter(data)
            .execute();
    }

    public getOrderDetail(id: number | string) {
        return this.getSdk()
            .model(this.generalOrder)
            .detail(id as string)
            .query();
    }

    public sendPayAccountInfo(params: { send: string; type?: number }) {
        return this.getSdk()
            .domainService("hro_spview", "OrderSetting", "sendPayAccountInfo")
            .request("get", { params });
    }

    public sendPayAccountInfoForAgent(params: {
        send: string;
        userOrderPaymentId: number;
    }) {
        return this.getSdk()
            .domainService(
                "hro_spview",
                "OrderSetting",
                "sendPayAccountInfoForAgent"
            )
            .request("get", { params });
    }

    public getComments(order: number | string) {
        return this.getSdk()
            .model(orderService.commentModel)
            .list("system_remark")
            .addPrefilter({ associate_id: order })
            .query({ pageIndex: 1, item_size: 100 })
            .then((r) => {
                if (r && r.pageData && r.pageData.rows) {
                    const items = this.handler.buildRows<OrderComment>(
                        r.pageData.rows,
                        {
                            id: "",
                            time: "create_time",
                            attachment: "attachments_label",
                            user: "dealer_name",
                            content: "",
                        }
                    );

                    return items;
                }
                return [];
            });
    }
}

export const orderService = new OrderService();