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

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

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

import com.ecep.contract.MyDateTimeUtils;

/**
 * 本地日期时间单元格
 */
public class LocalDateTimeTableCell<T>
        extends javafx.scene.control.TableCell<T, java.time.LocalDateTime> {

    /**
     * 静态工厂方法，创建TableCell的回调工厂
     * 
     * @param <T> 表格数据类型
     * @return TableCell的回调工厂
     */
    public static <T> Callback<TableColumn<T, LocalDateTime>, TableCell<T, LocalDateTime>> forTableColumn() {
        return column -> new LocalDateTimeTableCell<>();
    }

    /**
     * 静态工厂方法，使用指定格式创建TableCell的回调工厂
     * 
     * @param <T>    表格数据类型
     * @param format 日期时间格式
     * @return TableCell的回调工厂
     */
    public static <T> Callback<TableColumn<T, LocalDateTime>, TableCell<T, LocalDateTime>> forTableColumn(
            String format) {
        return column -> new LocalDateTimeTableCell<>(format);
    }

    /**
     * 静态工厂方法，使用指定的DateTimeFormatter创建TableCell的回调工厂
     * 
     * @param <T>       表格数据类型
     * @param formatter DateTimeFormatter对象
     * @return TableCell的回调工厂
     */
    public static <T> Callback<TableColumn<T, LocalDateTime>, TableCell<T, LocalDateTime>> forTableColumn(
            DateTimeFormatter formatter) {
        return column -> new LocalDateTimeTableCell<>(formatter);
    }

    private final DateTimeFormatter formatter;

    public LocalDateTimeTableCell(DateTimeFormatter formatter) {
        this.formatter = formatter;
    }

    public LocalDateTimeTableCell(String format) {
        this(DateTimeFormatter.ofPattern(format));
    }

    public LocalDateTimeTableCell() {
        this(MyDateTimeUtils.DEFAULT_DATETIME_FORMAT_PATTERN);
    }

    @Override
    protected void updateItem(LocalDateTime item, boolean empty) {
        super.updateItem(item, empty);
        if (empty || item == null) {
            setText(null);
        } else {
            setText(item.format(formatter));
        }
    }

}
