import { url } from "../../App"

import {
    actionPromise,
    actionLogin,
    actionAuthLogin,
    actionRegistration,
    actionAuthLogout,
    actionFindUserOne,
    actionPostsCount,
    actionFeedFindOne,
    actionCreatePost,
    actionFindPostOne,
    actionFindCommentsPostOne,
    actionAddComment,
    actionFindFollowers,
    actionFindFollowing,
    actionAddLike,
    actionDeleteLike,
    actionUpdateProfile
} from "./action"



// Логин и последующая логинизация в authReduser
export const actionFullLogin = (login, password) =>
    async dispatch => {

        const token = await dispatch(actionLogin(login, password))

        if (token !== null) {
            if (typeof (token) === 'string') {
                dispatch(actionAuthLogin(token))
                localStorage.authToken = token
            }
        }

        return token
    }



// Регистрация и последующая логинизация
export const actionFullRegistration = (login, password) =>
    async dispatch => {

        const token = await dispatch(actionRegistration(login, password))

        if (token !== null) {
            dispatch(actionFullLogin(login, password))
        }

        return token
    }



// Разлогин и последующая полна очистка localStorage
export const actionFullLogout = () =>
    async dispatch => {
        await dispatch(actionAuthLogout())
        return {}
    }



// Запрос юзера (данные о пользователе + количество его постов + все его посты(100 шт))
export const actionFullUserFindOne = _id =>
    async dispatch => {

        // запрашиваем информацию о пользователе
        await dispatch(actionFindUserOne(_id, 'UserFindOne'))

        // парсим счетчик, сколько постов у юзера
        dispatch(actionPostsCount(_id, 'UserPostsCount'))

        // запрашиваем список постов для юзера
        dispatch(actionFeedFindOne([_id], -1, 100, 'UserFeed'))
    }



// Запрос AboutMe для главной
export const actionAboutMe = () =>
    async (dispatch, getState) => {
        const myId = getState()?.auth?.payload?.sub?.id

        // диспатчим запрос AboutMe (о себе)
        const userData = await dispatch(actionFindUserOne(myId, 'AboutMe'))

        // парсим счетчик, сколько постов у меня
        dispatch(actionPostsCount(myId, 'MyPostsCount'))

        let followingList = []
        // проверяем, есть ли вообще подписчики и если да, парсим их
        if (userData?.following) {
            // получаем id всех подписок
            followingList = (userData.following).map(user => user?._id)
        }

        // запрашиваем формирование ленты моих постов (первый параметр - список id, второй - это сортировка постов от новых)
        dispatch(actionFeedFindOne(followingList, -1, 10, 'MyFeed'))


        // =====================================
        // собираем id подписок и подписчиков
        // console.log(33, userData)
        const podpisotaList = []

        for (const key in userData) {
            if (key === 'following' || key === 'followers') {
                for (const item of userData[key]) {
                    if (!podpisotaList.includes(item._id)) {
                        podpisotaList.push(item._id);
                    }
                }
            }
        }

        // диспатчим список для рекомендаций
        await Promise.all([dispatch(actionFindFollowers(podpisotaList)), dispatch(actionFindFollowing(podpisotaList))])
    }



// ================= на удаление (начало)=====================
// Запрос на догрузку ленты постов
export const actionDownloadFeed = (skip) =>
    async (dispatch, getState) => {

        console.log('скипаем: ', skip)
        const followingList = (getState()?.promise?.AboutMe?.payload?.following).map(user => user._id)

        if (followingList) {
            const result = await dispatch(actionFeedFindOne(followingList, -1, 10, 'AddFeed', skip))

            return result
        }
    }
// ================= на удаление(конец) =====================



// запрос на загрузку картинок на бек
function fileUpload(file) {
    const formData = new FormData()
    formData.append('photo', file)

    return (
        fetch((url + 'upload'), {
            method: 'POST',
            headers: {
                Authorization: 'Bearer ' + localStorage.authToken
            },
            body: formData
        }).then(res => res.json())
    )
}

function filesUpload(files) {
    return Promise.all(files.map(fileUpload))
}

export const actionFilesUpload = files => actionPromise('PROMISE', 'FilesUpload',
    filesUpload(files)
)



// Создание поста и последующий переход на него
export const actionFullCreatePost = (params) =>
    async dispatch => {
        const newPost = await dispatch(actionCreatePost(params))

        if (newPost) {
            dispatch(actionFindPostOne(newPost._id))
        }
    }





// Загрузка всех комментариев к посту с последующей их сортировкой и построением дерева комментариве
export const actionFullFindCommentsPostOne = id =>
    async dispatch => {
        const comments = await dispatch(actionFindCommentsPostOne(id))

        // console.log('comments: ', comments)

        // const res = commentsTreeConstructor(comments)

        // console.log('result: ', res)

        // return res
    }



// создание комментария с последующей загрузкой с бека списка всех постов, которые относятся к этой записи
export const actionFullAddComment = (nameOfPromise, params, id) =>
    async dispatch => {
        const newComment = await dispatch(actionAddComment(nameOfPromise, params))

        if (typeof newComment._id === 'string') {
            dispatch(actionFullFindCommentsPostOne(id))
        }
    }





// создание лайка с последующим добавлением к определенной сущности и последующим обновление определенной сущности
export const actionFullAddLike = params =>
    async dispatch => {
        const res = await dispatch(actionAddLike(params))

        // загружаем данные поста с бетка, если лайк был для поста
        if (res?.post) {
            dispatch(actionFindPostOne(res?.post?._id))
        }

        // загружаем данные комментариев для поста с бетка, если лайк был для комментарий
        if (res?.comment) {
            dispatch(actionFindPostOne(res.comment._id))
        }
    }





// удаление лайка с последующим удаление к определенной сущности и последующим обновление определенной сущности
export const actionFullDeleteLike = params =>
    async dispatch => {
        const res = await dispatch(actionDeleteLike(params))

        // при удачном удалении отправляем запрос на обновление данных страницы
        if (res?._id) {
            dispatch(actionFindPostOne(res.post._id))
        }
    }





// запрос на обновление профиля и последующая отправка запрос обо мне на бек
export const actionFullUpdateProfile = params =>
    async dispatch => {
        console.log('params: ', params)
        // const res = await dispatch(actionUpdateProfile(params))

        // console.log('res: ', res)
    }