package net.micode.notes.ui;

import java.util.Calendar;

import net.micode.notes.R;
import net.micode.notes.ui.DateTimePicker;
import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
/**
 * @Package:        net.micode.notes.ui
 * @ClassName:      DateTimePickerDialog
 * @Description:
 * DateTimePickerDialog是一个自定义对话框，允许用户选择日期和时间。
 * 它继承自AlertDialog类，并实现OnClickListener接口。
 * 对话框包含一个DateTimePicker控件，用于选择日期和时间。
 * 通过OnDateTimeSetListener接口将选择的日期和时间传递给监听器。
 * 对话框还提供了设置24小时制和使用选择的日期更新对话框标题的方法。
 * onClick方法处理按钮点击事件，并在日期和时间设置完成时通知监听器。
 * @Author:         YangYizhe
 * @CreateDate:     12/21/2023 12:32 AM
 * @Version:        1.0
 */
public class DateTimePickerDialog extends AlertDialog implements OnClickListener {

    private Calendar mDate = Calendar.getInstance();
    private boolean mIs24HourView;
    private OnDateTimeSetListener mOnDateTimeSetListener;
    private DateTimePicker mDateTimePicker;

    /**
     * 用于接收用户设置的日期和时间的接口。
     */
    public interface OnDateTimeSetListener {
        void OnDateTimeSet(AlertDialog dialog, long date);
    }

    /**
     * @method  DateTimePickerDialog
     * @description
     * 构造一个新的DateTimePickerDialog
     * Remind me功能的对话框
     * @date: 12/21/2023 8:01 AM
     * @author: YangYizhe
     * @param context 上下文环境。
     * @param date    要在对话框中显示的初始日期。
     */
    public DateTimePickerDialog(Context context, long date) {
        super(context);
        mDateTimePicker = new DateTimePicker(context);
        setView(mDateTimePicker);

        mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() {
            public void onDateTimeChanged(DateTimePicker view, int year, int month,
                                          int dayOfMonth, int hourOfDay, int minute) {
                mDate.set(Calendar.YEAR, year);
                mDate.set(Calendar.MONTH, month);
                mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                mDate.set(Calendar.HOUR_OF_DAY, hourOfDay);
                mDate.set(Calendar.MINUTE, minute);
                updateTitle(mDate.getTimeInMillis());
            }
        });

        mDate.setTimeInMillis(date);
        mDate.set(Calendar.SECOND, 0);
        mDateTimePicker.setCurrentDate(mDate.getTimeInMillis());

        setButton(context.getString(R.string.datetime_dialog_ok), this);
        setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener) null);

        set24HourView(DateFormat.is24HourFormat(this.getContext()));
        updateTitle(mDate.getTimeInMillis());
    }

    /**
     * 设置对话框是否为24小时制。
     *
     * @param is24HourView 如果对话框为24小时制，则为true；否则为false。
     */
    public void set24HourView(boolean is24HourView) {
        mIs24HourView = is24HourView;
    }

    /**
     * 设置日期和时间设置监听器。
     *
     * @param callBack 要通知的监听器。
     */
    public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) {
        mOnDateTimeSetListener = callBack;
    }

    /**
     * 使用指定的日期更新对话框标题。
     *
     * @param date 要显示在标题中的日期。
     */
    private void updateTitle(long date) {
        int flag =
                DateUtils.FORMAT_SHOW_YEAR |
                        DateUtils.FORMAT_SHOW_DATE |
                        DateUtils.FORMAT_SHOW_TIME;
        flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR;

        setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
    }

    /**
     * 处理按钮点击事件。
     *
     * @param arg0 接收到点击事件的对话框。
     * @param arg1 被点击的按钮。
     */
    public void onClick(DialogInterface arg0, int arg1) {
        if (mOnDateTimeSetListener != null) {
            mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
        }
    }

}