import { ref } from 'vue'
import { defineStore } from 'pinia'
import { useMember } from '@/composables/useMember'
import { useAuthStore } from '@/stores/auth.store'
import { DEFAULT_PAGE_SIZE } from '@/types/pagination'
import type {
  ApiProjectMember,
  InviteMemberPayload,
  UpdateMemberPayload,
} from '@/types/member'
import type { ProjectMember as MemberView } from '@/mock/relay.mock'

// API 멤버 → 화면용 ProjectMember(이니셜/색상 파생 + isYou 산출)
function toMemberView(api: ApiProjectMember, currentUserId: string | null): MemberView {
  return {
    user: {
      id: api.user.id,
      name: api.user.name,
      role: api.user.role ?? '',
      avatarUrl: api.user.avatarUrl,
    },
    email: api.email,
    taskCount: api.taskCount,
    roleType: api.roleType,
    isYou: api.user.id === currentUserId,
    owner: api.owner,
  }
}

// 프로젝트 멤버 스토어 — 현재 프로젝트의 멤버 목록 상태 + 초대/역할변경/제거 액션
export const useMemberStore = defineStore('member', () => {
  const members = ref<MemberView[]>([])
  const loading = ref(false)

  const memberApi = useMember()
  const authStore = useAuthStore()

  // 현재 로그인 사용자 id (isYou 산출용)
  function currentUserId(): string | null {
    return authStore.user?.id ?? null
  }

  // 멤버 목록 조회 — 백엔드는 페이지네이션이지만, 역할/검색 카운트와 담당자 후보 풀
  // (TaskCreatePage)이 전수 기준이어야 하므로 모든 페이지를 순회해 전체를 로드한다.
  // (멤버는 팀 규모로 한정적이라 전체 로드가 안전하다)
  async function fetchList(projectId: string): Promise<void> {
    loading.value = true
    try {
      const acc: ApiProjectMember[] = []
      let page = 1
      for (;;) {
        const { items, total } = await memberApi.list(projectId, page, DEFAULT_PAGE_SIZE)
        acc.push(...items)
        if (items.length === 0 || acc.length >= total) break
        page += 1
      }
      members.value = acc.map((m) => toMemberView(m, currentUserId()))
    } finally {
      loading.value = false
    }
  }

  // 멤버 초대 — 성공 시 목록에 추가
  async function invite(projectId: string, payload: InviteMemberPayload): Promise<void> {
    const created = await memberApi.invite(projectId, payload)
    members.value.push(toMemberView(created, currentUserId()))
  }

  // 멤버 역할/직무 변경 — 성공 시 해당 행 교체
  async function update(
    projectId: string,
    userId: string,
    payload: UpdateMemberPayload,
  ): Promise<void> {
    const updated = await memberApi.update(projectId, userId, payload)
    const view = toMemberView(updated, currentUserId())
    const idx = members.value.findIndex((m) => m.user.id === userId)
    if (idx >= 0) members.value[idx] = view
  }

  // 멤버 제거 — 성공 시 목록에서 제외
  async function remove(projectId: string, userId: string): Promise<void> {
    await memberApi.remove(projectId, userId)
    members.value = members.value.filter((m) => m.user.id !== userId)
  }

  return { members, loading, fetchList, invite, update, remove }
})
