/*
    Предрейсовые осмотры - мобильное приложение
    Хук предметной области "Предрейсовые осмотры"

    Объединяет:
    - работу с сервером приложений;
    - работу с локальной базой данных;
    - управление состоянием загрузки/ошибок.
*/

//---------------------
//Подключение библиотек
//---------------------

const React = require('react'); //React и хуки
const useAppServer = require('./useAppServer'); //Хук для сервера приложений
const { useAppLocalDbContext } = require('../components/layout/AppLocalDbProvider'); //Контекст локальной БД
const { useAppModeContext } = require('../components/layout/AppModeProvider'); //Контекст режима работы
const { LOAD_STATUS_IDLE, LOAD_STATUS_LOADING, LOAD_STATUS_DONE, LOAD_STATUS_ERROR } = require('../config/loadStatus'); //Статусы загрузки

//-----------
//Тело модуля
//-----------

//Хук предметной области "Предрейсовые осмотры"
function usePreTripInspections() {
    const { executeAction, isRespErr, getRespErrMessage, RESP_STATUS_OK } = useAppServer();
    const { inspections, loadInspections, saveInspection, isDbReady } = useAppLocalDbContext();
    const { APP_MODE, mode } = useAppModeContext();

    const [loadStatus, setLoadStatus] = React.useState(LOAD_STATUS_IDLE);
    const [error, setError] = React.useState(null);

    //Загрузка списка осмотров:
    //1) Если режим OFFLINE - работаем только с локальной БД;
    //2) Если режим ONLINE - пробуем получить данные с сервера приложений,
    //   при ошибке используем локальные данные.
    const refreshInspections = React.useCallback(async () => {
        //Проверяем готовность базы данных
        if (!isDbReady) {
            return {
                inspections: [],
                fromServer: false
            };
        }

        setLoadStatus(LOAD_STATUS_LOADING);
        setError(null);

        //Режим OFFLINE - работаем только с локальными данными
        if (mode === APP_MODE.OFFLINE) {
            const localInspections = await loadInspections();
            setLoadStatus(LOAD_STATUS_DONE);
            return {
                inspections: localInspections,
                fromServer: false
            };
        }

        //Режим ONLINE - пробуем получить данные с сервера приложений
        const serverResponse = await executeAction({
            path: 'api/pretrip/inspections',
            method: 'POST',
            payload: {}
        });

        //Ошибка запроса — используем локальные данные
        if (isRespErr(serverResponse) || serverResponse.status !== RESP_STATUS_OK) {
            const localInspections = await loadInspections();
            setLoadStatus(localInspections.length > 0 ? LOAD_STATUS_DONE : LOAD_STATUS_ERROR);
            setError(getRespErrMessage(serverResponse) || 'Не удалось получить данные с сервера приложений');
            return {
                inspections: localInspections,
                fromServer: false
            };
        }

        //Успех - приводим полезную нагрузку к ожидаемому виду
        const payload = serverResponse.payload || {};
        const resultInspections = Array.isArray(payload.inspections) ? payload.inspections : [];

        setLoadStatus(LOAD_STATUS_DONE);

        return {
            inspections: resultInspections,
            fromServer: true
        };
    }, [APP_MODE.OFFLINE, RESP_STATUS_OK, executeAction, getRespErrMessage, isDbReady, isRespErr, loadInspections, mode]);

    //Создание или обновление осмотра
    const upsertInspection = React.useCallback(
        async inspection => {
            const safeInspection = {
                id: inspection.id || `local-${Date.now()}`,
                title: inspection.title || 'Новый осмотр',
                status: inspection.status || 'DRAFT',
                createdAt: inspection.createdAt || new Date().toISOString()
            };

            //Сохраняем в локальной БД (всегда, независимо от режима)
            await saveInspection(safeInspection);

            //Если приложение в режиме ONLINE - отправляем данные на сервер приложений
            if (mode === APP_MODE.ONLINE) {
                await executeAction({
                    path: 'api/pretrip/inspections/save',
                    method: 'POST',
                    payload: { inspection: safeInspection }
                });
            }

            return safeInspection;
        },
        [APP_MODE.ONLINE, executeAction, saveInspection, mode]
    );

    return {
        inspections,
        loadStatus,
        error,
        isDbReady,
        refreshInspections,
        upsertInspection
    };
}

//----------------
//Интерфейс модуля
//----------------

module.exports = usePreTripInspections;
