import { queryAttendanceCode, queryShiftAndExplanationConfig } from '../../../query/explannation';
import { LIST_DAY_OF_WEEK } from '../../../utils/constants';
import { PHXClientQueryV3 } from '../GRPC/PHXGrpcClientV3';
import PHXFuncGetLoggedInfo from '../getLoginInfo';
// Tính số giờ làm việc thực tế
function getDurationTime(timeCheckin, // "07:30:00"
timeCheckout, // "17:30:00"
lunchBreakStart, // "12:00:00"
lunchBreakEnd) {
    if (!timeCheckin || !timeCheckout)
        return 0;
    const baseDate = new Date(); // mốc ngày bất kỳ (hôm nay)
    baseDate.setHours(0, 0, 0, 0);
    const parseTimeToDate = (timeStr) => {
        const [h, m, s] = timeStr.split(':').map(Number);
        const d = new Date(baseDate);
        d.setHours(h, m, s || 0, 0);
        return d;
    };
    const start = parseTimeToDate(timeCheckin);
    const end = parseTimeToDate(timeCheckout);
    let totalMinutes = Math.floor((end.getTime() - start.getTime()) / (1000 * 60));
    if (lunchBreakStart && lunchBreakEnd) {
        const breakStart = parseTimeToDate(lunchBreakStart);
        const breakEnd = parseTimeToDate(lunchBreakEnd);
        // Tính phần giao giữa thời gian làm việc và nghỉ trưa
        const overlapStart = new Date(Math.max(start.getTime(), breakStart.getTime()));
        const overlapEnd = new Date(Math.min(end.getTime(), breakEnd.getTime()));
        const breakDurationMinutes = Math.max(0, (overlapEnd.getTime() - overlapStart.getTime()) / (1000 * 60));
        totalMinutes -= breakDurationMinutes;
    }
    // Làm tròn số phút
    const totalMinuteCeils = Math.ceil(totalMinutes);
    const totalHours = totalMinuteCeils / 60;
    return totalHours;
}
export default async function PHXAllowExplanation({ request_code, work_date, start_at, end_at, attendance_code_id, }) {
    var _a, _b, _c, _d, _e, _f, _g, _h;
    try {
        const isCheckValidateTimeInput = Boolean(attendance_code_id && start_at && end_at);
        const userInfo = PHXFuncGetLoggedInfo();
        // Id của người tạo đơn
        const userLoginId = userInfo === null || userInfo === void 0 ? void 0 : userInfo.id;
        const school_id = userInfo === null || userInfo === void 0 ? void 0 : userInfo.school_id;
        // Lấy ra các ngày làm việc trong tuần và config giới hạn tạo đơn giải trình
        const { data = {} } = await PHXClientQueryV3({
            query: queryShiftAndExplanationConfig,
            variables: { school_id, user_id: userLoginId },
        });
        const isHasData = ((_a = data.hrm_checkin_hrm_checkin_shift_config) === null || _a === void 0 ? void 0 : _a.length) > 0 &&
            ((_b = data.hrm_checkin_explanation_config) === null || _b === void 0 ? void 0 : _b.length) > 0 &&
            ((_c = data.users) === null || _c === void 0 ? void 0 : _c.length) > 0;
        // Không có data sẽ trả về false luôn
        if (!isHasData)
            return false;
        const { hrm_checkin_explanation_config = [], hrm_checkin_hrm_checkin_shift_config = [], users = [] } = data;
        // Lấy ra danh sách các ngày đi làm theo phòng ban
        const staffDepartmentData = ((_d = users[0]) === null || _d === void 0 ? void 0 : _d.department_users) || [];
        const staffDepartmentId = ((_e = staffDepartmentData[0]) === null || _e === void 0 ? void 0 : _e.department_id) || 0;
        // Số ngày giới hạn giải trình (sau bao nhiêu ngày)
        const limitTimeCreate = (_f = hrm_checkin_explanation_config.find((item) => { var _a; return ((_a = item.approval_type) === null || _a === void 0 ? void 0 : _a.code) === request_code || item.request_type_id === null; })) === null || _f === void 0 ? void 0 : _f.limit_time_create;
        // Tìm xem checkin config của phòng ban đó xem đi làm những ngày nào
        const dataShiftConfig = hrm_checkin_hrm_checkin_shift_config.find((configData) => configData.department_id === staffDepartmentId || configData.department_id === null) || {};
        // Nếu check validate input date ta sẽ xử lý ở đây
        if (isCheckValidateTimeInput) {
            // Lấy số giờ làm việc quy định của mã muốn giải trình
            const { data: codeData = {} } = await PHXClientQueryV3({
                query: queryAttendanceCode,
                variables: { id: attendance_code_id },
            });
            const workTimeExplanation = Number(((_h = (_g = codeData.hrm_checkin_attendance_code) === null || _g === void 0 ? void 0 : _g[0]) === null || _h === void 0 ? void 0 : _h.work_time) || 0);
            // Nếu ngày giải trình k có workTime auto return true
            if (!workTimeExplanation)
                return true;
            // Lấy số giờ nhập trừ đi nghỉ trưa nếu có
            const { break_start, break_end, allow_break_time } = dataShiftConfig;
            // Kiểm tra xem có giờ nghỉ trưa hay không
            const isHasBreakTime = Boolean(allow_break_time && break_start && break_end);
            const totalWorkingReal = isHasBreakTime
                ? getDurationTime(start_at, end_at, break_start, break_end)
                : getDurationTime(start_at, end_at);
            return totalWorkingReal >= workTimeExplanation;
        }
        else {
            // nếu không giới hạn thời gian tạo đơn return true luôn
            if (!limitTimeCreate)
                return true;
            const { applicable_days = [] } = dataShiftConfig;
            // helper: convert "2025-08-25" -> Date (00:00)
            const parseDate = (dateStr) => {
                const [y, m, d] = dateStr.split('-').map(Number);
                return new Date(y, m - 1, d);
            };
            const getDayName = (date) => LIST_DAY_OF_WEEK[date.getDay()];
            const workDate = parseDate(work_date);
            const today = new Date();
            const currentDate = new Date(today.getFullYear(), today.getMonth(), today.getDate());
            // nếu work_date > hôm nay thì không hợp lệ
            if (workDate > currentDate)
                return false;
            let workingDaysPassed = 0;
            const d = new Date(workDate);
            // duyệt từ ngày sau workDate tới currentDate
            while (d < currentDate) {
                d.setDate(d.getDate() + 1);
                if (applicable_days.includes(getDayName(d))) {
                    workingDaysPassed++;
                }
            }
            // chỉ hợp lệ nếu số ngày làm việc đã qua <= limit_time_create
            return workingDaysPassed <= Number(limitTimeCreate);
        }
    }
    catch (error) {
        console.log(error, 'error');
        return false;
    }
}
//# sourceMappingURL=checkAllowExplanation.js.map