import { createSlice, createAsyncThunk, type PayloadAction } from "@reduxjs/toolkit"

// Define a type for the team member
export interface TeamMember {
  id: number
  firstName: string
  lastName: string
  email: string
  phoneNumber: string
  roleId: number
  roleName: string
  departmentId: number
  departmentName: string
  businessVerticalId: number | null
  businessVerticalName: string
  reportingTo: string | null
  joiningDate: string
  status: string
  avatar: string
}

// Define the state type
interface TeamMembersState {
  items: TeamMember[]
  status: "idle" | "loading" | "succeeded" | "failed"
  error: string | null
  selectedMember: TeamMember | null
  filters: {
    search: string
    roles: string[]
    departments: string[]
    businessVerticals: string[]
    status: string[]
  }
}

// Initial state
const initialState: TeamMembersState = {
  items: [],
  status: "idle",
  error: null,
  selectedMember: null,
  filters: {
    search: "",
    roles: [],
    departments: [],
    businessVerticals: [],
    status: [],
  },
}

// Sample data for initial development
const sampleTeamMembers: TeamMember[] = [
  {
    id: 1,
    firstName: "John",
    lastName: "Doe",
    email: "john.doe@example.com",
    phoneNumber: "+1 (555) 123-4567",
    roleId: 5,
    roleName: "Operation Manager",
    departmentId: 1,
    departmentName: "Operations",
    businessVerticalId: 1,
    businessVerticalName: "Transport",
    reportingTo: null,
    joiningDate: "2020-05-15",
    status: "active",
    avatar: "john-doe",
  },
  {
    id: 2,
    firstName: "Jane",
    lastName: "Smith",
    email: "jane.smith@example.com",
    phoneNumber: "+1 (555) 987-6543",
    roleId: 4,
    roleName: "Call Center Admin",
    departmentId: 1,
    departmentName: "Operations",
    businessVerticalId: 1,
    businessVerticalName: "Transport",
    reportingTo: "John Doe",
    joiningDate: "2021-02-10",
    status: "active",
    avatar: "jane-smith",
  },
  // More sample data can be added here
]

// Async thunks for API calls
export const fetchTeamMembers = createAsyncThunk("teamMembers/fetchTeamMembers", async (_, { rejectWithValue }) => {
  try {
    // In a real app, this would be an API call
    // For now, we'll just return the sample data after a delay to simulate a network request
    await new Promise((resolve) => setTimeout(resolve, 1000))
    return sampleTeamMembers
  } catch (error) {
    return rejectWithValue("Failed to fetch team members")
  }
})

export const addTeamMember = createAsyncThunk(
  "teamMembers/addTeamMember",
  async (teamMember: Omit<TeamMember, "id">, { rejectWithValue }) => {
    try {
      // In a real app, this would be an API call
      await new Promise((resolve) => setTimeout(resolve, 1000))
      // Generate a new ID (in a real app, the server would do this)
      const newTeamMember = {
        ...teamMember,
        id: Date.now(),
      }
      return newTeamMember
    } catch (error) {
      return rejectWithValue("Failed to add team member")
    }
  },
)

// Create the slice
const teamMembersSlice = createSlice({
  name: "teamMembers",
  initialState,
  reducers: {
    setSelectedMember: (state, action: PayloadAction<TeamMember | null>) => {
      state.selectedMember = action.payload
    },
    updateFilters: (state, action: PayloadAction<Partial<TeamMembersState["filters"]>>) => {
      state.filters = { ...state.filters, ...action.payload }
    },
    resetFilters: (state) => {
      state.filters = initialState.filters
    },
  },
  extraReducers: (builder) => {
    builder
      .addCase(fetchTeamMembers.pending, (state) => {
        state.status = "loading"
      })
      .addCase(fetchTeamMembers.fulfilled, (state, action) => {
        state.status = "succeeded"
        state.items = action.payload
      })
      .addCase(fetchTeamMembers.rejected, (state, action) => {
        state.status = "failed"
        state.error = action.payload as string
      })
      .addCase(addTeamMember.fulfilled, (state, action) => {
        state.items.push(action.payload)
      })
  },
})

export const { setSelectedMember, updateFilters, resetFilters } = teamMembersSlice.actions

export default teamMembersSlice.reducer

