import { request, type ApiResponse } from './request'

interface UserDto {
  userId: number
  userName: string | null
  nickName: string | null
  phonenumber?: string | null
  roleId?: number | null
  createTime?: string | null
  status: string | null
}

interface UserListResponse extends ApiResponse {
  total: number
  rows: UserDto[]
}

export interface UserOption {
  id: number
  name: string
  userName: string
}

export interface RoleOption {
  roleId: number
  roleName: string
}

interface RoleOptionDto {
  roleId: number
  roleName: string | null
}

interface RoleOptionResponse extends ApiResponse {
  data: RoleOptionDto[]
}

export interface CreateUserInput {
  nickName: string
  userName: string
  phonenumber: string
  password: string
  status: '0' | '1'
  roleIds: number[]
}

export interface UpdateUserInput extends Omit<CreateUserInput, 'password'> {
  userId: number
  password?: string
}

export interface UserListParams {
  pageNum: number
  pageSize: number
  nickName?: string
  phonenumber?: string
  roleId?: number
  status?: string
}

export interface UserListItem {
  id: number
  name: string
  username: string
  phone: string
  roleId: number
  status: '启用' | '禁用'
  createdAt: string
}

export interface UserListResult {
  total: number
  rows: UserListItem[]
}

export async function getEnabledUserOptions(): Promise<UserOption[]> {
  const searchParams = new URLSearchParams({
    pageNum: '1',
    pageSize: '1000',
    status: '0',
  })
  const result = await request<UserListResponse>(`/system/user/list?${searchParams.toString()}`)
  return (result.rows || [])
    .filter(item => item.status === '0')
    .map(item => ({
      id: item.userId,
      name: item.nickName?.trim() || item.userName?.trim() || `用户${item.userId}`,
      userName: item.userName?.trim() || '',
    }))
}

export async function getUserList(params: UserListParams): Promise<UserListResult> {
  const searchParams = new URLSearchParams()
  Object.entries(params).forEach(([key, value]) => {
    if (value !== undefined && value !== '') searchParams.set(key, String(value))
  })
  const result = await request<UserListResponse>(`/system/user/list?${searchParams.toString()}`)
  return {
    total: Number(result.total) || 0,
    rows: (result.rows || []).map(item => ({
      id: item.userId,
      name: item.nickName || '-',
      username: item.userName || '-',
      phone: item.phonenumber || '',
      roleId: Number(item.roleId) || 0,
      status: item.status === '0' ? '启用' : '禁用',
      createdAt: item.createTime || '',
    })),
  }
}

export async function getRoleOptions(): Promise<RoleOption[]> {
  const result = await request<RoleOptionResponse>('/system/role/optionselect')
  return (result.data || []).map(item => ({
    roleId: item.roleId,
    roleName: item.roleName || `角色${item.roleId}`,
  }))
}

export function createUser(input: CreateUserInput): Promise<ApiResponse> {
  return request<ApiResponse>('/system/user', {
    method: 'POST',
    body: JSON.stringify(input),
  })
}

export function updateUser(input: UpdateUserInput): Promise<ApiResponse> {
  return request<ApiResponse>('/system/user', {
    method: 'PUT',
    body: JSON.stringify(input),
  })
}

export function changeUserStatus(userId: number, status: '0' | '1'): Promise<ApiResponse> {
  return request<ApiResponse>('/system/user/changeStatus', {
    method: 'PUT',
    body: JSON.stringify({ userId, status }),
  })
}

export function resetUserPassword(userId: number, password: string): Promise<ApiResponse> {
  return request<ApiResponse>('/system/user/resetPwd', {
    method: 'PUT',
    body: JSON.stringify({ userId, password }),
  })
}

export async function deleteUsers(userIds: number[]): Promise<void> {
  await request<ApiResponse>(`/system/user/${userIds.join(',')}`, {
    method: 'DELETE',
  })
}
