package com.ecep.contract.controller.table.cell;

import static com.ecep.contract.SpringApp.getBean;

import com.ecep.contract.CustomerFileType;
import com.ecep.contract.service.CompanyCustomerFileTypeService;
import com.ecep.contract.vo.CustomerFileTypeLocalVo;

import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.util.Callback;
import lombok.NoArgsConstructor;

import java.util.Locale;

/**
 * 公司客户文件类型表格单元格，用于在表格中显示客户文件类型信息
 * 根据国际化设置显示对应的文件类型名称
 */
@NoArgsConstructor
public class CompanyCustomerFileTableTypeTableCell<T> extends AsyncUpdateTableCell<T, CustomerFileType, CustomerFileTypeLocalVo> {
    private CompanyCustomerFileTypeService companyCustomerFileTypeService;

    /**
     * 创建一个用于表格列的单元格工厂，自动获取CompanyCustomerFileTypeService实例
     *
     * @param <S> 表格行类型
     * @return TableCell工厂回调
     */
    public static <S> Callback<TableColumn<S, CustomerFileType>, TableCell<S, CustomerFileType>> forTableColumn() {
        return forTableColumn(getBean(CompanyCustomerFileTypeService.class));
    }

    /**
     * 创建一个用于表格列的单元格工厂，使用提供的CompanyCustomerFileTypeService实例
     *
     * @param <S>     表格行类型
     * @param service CompanyCustomerFileTypeService实例
     * @return TableCell工厂回调
     */
    public static <S> Callback<TableColumn<S, CustomerFileType>, TableCell<S, CustomerFileType>> forTableColumn(
            CompanyCustomerFileTypeService service) {
        return param -> new CompanyCustomerFileTableTypeTableCell<>(service);
    }

    /**
     * 使用提供的服务创建单元格实例
     *
     * @param service CompanyCustomerFileTypeService实例
     */
    public CompanyCustomerFileTableTypeTableCell(CompanyCustomerFileTypeService service) {
        this.companyCustomerFileTypeService = service;
    }

    /**
     * 获取CompanyCustomerFileTypeService服务实例
     * 如果未设置，则从Spring容器中获取
     *
     * @return CompanyCustomerFileTypeService实例
     */
    @Override
    protected CompanyCustomerFileTypeService getServiceBean() {
        if (companyCustomerFileTypeService == null) {
            companyCustomerFileTypeService = getBean(CompanyCustomerFileTypeService.class);
        }
        return companyCustomerFileTypeService;
    }

    /**
     * 初始化文件类型实体
     * 根据当前的CustomerFileType枚举值，从服务中获取对应的本地化实体
     *
     * @return 本地化的文件类型实体
     */
    @Override
    protected CustomerFileTypeLocalVo initialize() {
        CustomerFileType item = getItem();
        if (item == null) {
            return null;
        }

        // 获取当前用户的语言设置
        Locale locale = com.ecep.contract.Desktop.instance.getActiveEmployee().localeProperty().get();
        return getServiceBean().findByLocaleAndType(locale, item);
    }

    /**
     * 格式化显示文件类型
     * 如果有本地化实体，则显示本地化名称；否则显示枚举名称
     *
     * @param entity 本地化的文件类型实体
     * @return 格式化后的显示文本
     */
    @Override
    public String format(CustomerFileTypeLocalVo entity) {
        if (entity != null && entity.getValue() != null) {
            return entity.getValue();
        }
        CustomerFileType item = getItem();
        if (item != null) {
            // 根据枚举值返回对应的中文名称
            switch (item) {
                case General -> {
                    return "普通文件";
                }
                case EvaluationForm -> {
                    return "评估表";
                }
                default -> {
                    return item.name();
                }
            }
        }
        return "未知类型";
    }
}