/*
    작성자 : 박지윤
    작성일 : 2025-02-25
    수정자 :
    수정일 :
    설명   : 프로젝트 목록
*/
import { defineStore } from 'pinia';
import { ref, watch } from 'vue';
import $api from '@api';
import { useUserInfoStore } from '@/stores/useUserInfoStore';

export const useProjectStore = defineStore('project', () => {
    const projectList = ref([]);           // 모든 프로젝트 (종료된 프로젝트 포함)
    const activeProjectList = ref([]);     // 진행 중인 프로젝트만 (종료된 프로젝트 제외)
    const memberProjectList = ref([]);     // 사용자가 속한 프로젝트
    const activeMemberProjectList = ref([]); // 사용자가 속한 진행 중인 프로젝트
    const selectedProject = ref(null);
    const userStore = useUserInfoStore();

    // 전체 프로젝트 가져오기 (종료된 프로젝트 포함 여부에 따라 다른 배열에 저장)
    const getProjectList = async (searchText = '', selectedYear = '', excludeEnded = 'false') => {
        if (!userStore.user) return;
        const res = await $api.get('project/select', {
            params: {
                searchKeyword: searchText || '',
                category: selectedYear || '',
                excludeEnded: excludeEnded
            },
        });

        if (excludeEnded === 'true') {
            // 종료되지 않은 프로젝트만 저장
            activeProjectList.value = res.data.data.projectList;
        } else {
            // 모든 프로젝트 저장 (종료된 프로젝트 포함)
            projectList.value = res.data.data.projectList;
        }
    };

    // 모든 프로젝트 목록 로드 (종료 여부 구분하여 모두 로드)
    const loadAllProjectLists = async (searchText = '', selectedYear = '') => {
        // 진행 중인 프로젝트 로드
        await getProjectList(searchText, selectedYear, 'true');
        // 모든 프로젝트 로드 (종료된 프로젝트 포함)
        await getProjectList(searchText, selectedYear, 'false');
    };

    // 사용자가 속한 프로젝트 목록 가져오기
    const getMemberProjects = async () => {
        if (!userStore.user) return; // 로그인한 사용자 확인

        const res = await $api.get(`project/${userStore.user.id}`);
        const allMemberProjects = res.data.data;
        memberProjectList.value = allMemberProjects;

        // 사용자가 속한 프로젝트 중 진행 중인 프로젝트만 필터링
        activeMemberProjectList.value = allMemberProjects.filter(project =>
            !project.ENDYN || project.ENDYN === 'N'
        );

        if (activeMemberProjectList.value.length > 0 && !selectedProject.value) {
            setSelectedProject(activeMemberProjectList.value[0]);
        }
    };

    const setSelectedProject = (project) => {
        selectedProject.value = project ? { ...project } : null;
        if (project) {
            localStorage.setItem('selectedProject', JSON.stringify(project));
        } else {
            localStorage.removeItem('selectedProject');
        }
    };

    const getSelectedProject = () => {
        if (!selectedProject.value) {
            const storedProject = localStorage.getItem('selectedProject');
            if (storedProject) {
                selectedProject.value = JSON.parse(storedProject);
            }
        }
        return selectedProject.value;
    };

    // 프로젝트 리스트가 변경될 때 자동으로 반응
    watch(activeProjectList, (newList) => {
        // 선택된 프로젝트가 없고 목록이 있는 경우
        if (!selectedProject.value && newList.length > 0) {
            // 사용자가 속한 프로젝트가 있는지 먼저 확인
            if (activeMemberProjectList.value.length > 0) {
                setSelectedProject(activeMemberProjectList.value[0]);
            } else {
                setSelectedProject(newList[0]);
            }
        }
    });

    watch(activeMemberProjectList, (newList) => {
        if (newList.length > 0) {
            // 현재 선택된 프로젝트가 없는 경우 첫 번째 항목 선택
            if (!selectedProject.value) {
                setSelectedProject(newList[0]);
            } else {
                // 선택된 프로젝트가 있는 경우 목록에 있는지 확인
                const exists = newList.some(project => project.PROJCTSEQ === selectedProject.value.PROJCTSEQ);

                if (!exists) {
                    setSelectedProject(newList[0]);
                }
            }
        }
    });

    return {
        projectList,           // 종료된 프로젝트 포함한 모든 프로젝트
        activeProjectList,     // 진행 중인 프로젝트만
        memberProjectList,     // 사용자가 속한 모든 프로젝트
        activeMemberProjectList, // 사용자가 속한 진행 중인 프로젝트
        selectedProject,
        getProjectList,
        loadAllProjectLists,   // 모든 프로젝트 목록 한번에 로드
        getMemberProjects,
        setSelectedProject,
        getSelectedProject,
    };
});
