import { clearAuth, getToken } from './auth'
import type {
  LinkItem, UserList, Stats, Subscription,
  PaginatedResponse, AdminUser, AdminStats,
  SubscriptionPlan, TelegramUser,
} from './types'

const API = process.env.NEXT_PUBLIC_API_URL ?? 'http://localhost:8000'

async function apiFetch(path: string, options: RequestInit = {}) {
  const token = getToken()
  const res = await fetch(`${API}${path}`, {
    ...options,
    headers: {
      'Content-Type': 'application/json',
      ...(token ? { Authorization: `Bearer ${token}` } : {}),
      ...(options.headers ?? {}),
    },
  })

  if (res.status === 204) return null

  if (res.status === 401) {
    clearAuth()
    window.location.href = '/login'
    throw new Error('Unauthenticated')
  }

  const data = await res.json()
  if (!res.ok) throw data
  return data
}

export const api = {
  // Auth
  register: (email: string, password: string, name: string) =>
    apiFetch('/register', { method: 'POST', body: JSON.stringify({ email, password, name }) }),

  login: (email: string, password: string) =>
    apiFetch('/login', { method: 'POST', body: JSON.stringify({ email, password }) }),

  logout: () =>
    apiFetch('/logout', { method: 'POST' }),

  // Subscription
  getSubscription: (): Promise<Subscription> =>
    apiFetch('/subscription-status'),

  // Items
  getItems: (page = 1, filter = 'all'): Promise<PaginatedResponse<LinkItem>> =>
    apiFetch(`/items?page=${page}&filter=${filter}`),

  getLatestItems: (): Promise<{ data: LinkItem[] }> =>
    apiFetch('/items/latest'),

  deleteItem: (id: number): Promise<null> =>
    apiFetch(`/items/${id}`, { method: 'DELETE' }),

  // Search
  search: (q: string): Promise<{ query: string; results: LinkItem[] }> =>
    apiFetch(`/search?q=${encodeURIComponent(q)}`),

  // Stats
  getStats: (): Promise<Stats> =>
    apiFetch('/stats'),

  // Lists
  getLists: (): Promise<{ data: UserList[] }> =>
    apiFetch('/lists'),

  getListItems: (listId: number): Promise<{ list: UserList; data: LinkItem[] }> =>
    apiFetch(`/lists/${listId}/items`),

  createList: (name: string): Promise<UserList> =>
    apiFetch('/lists', { method: 'POST', body: JSON.stringify({ name }) }),

  addToList: (listId: number, linkId: number) =>
    apiFetch(`/lists/${listId}/items`, { method: 'POST', body: JSON.stringify({ link_id: linkId }) }),

  removeFromList: (listId: number, linkId: number) =>
    apiFetch(`/lists/${listId}/items/${linkId}`, { method: 'DELETE' }),

  // Admin — Stats & Web Users
  adminGetStats: (): Promise<AdminStats> =>
    apiFetch('/admin/stats'),

  adminGetUsers: (page = 1, search = '', status = 'all'): Promise<PaginatedResponse<AdminUser>> =>
    apiFetch(`/admin/users?page=${page}&search=${encodeURIComponent(search)}&status=${status}`),

  adminSetUserStatus: (userId: number, status: string): Promise<{ message: string }> =>
    apiFetch(`/admin/users/${userId}/status`, { method: 'PATCH', body: JSON.stringify({ status }) }),

  adminSetSubscription: (userId: number, days: number): Promise<{ message: string }> =>
    apiFetch(`/admin/users/${userId}/subscription`, { method: 'POST', body: JSON.stringify({ days }) }),

  adminDeleteUser: (userId: number): Promise<null> =>
    apiFetch(`/admin/users/${userId}`, { method: 'DELETE' }),

  // Admin — Plans
  adminGetPlans: (): Promise<{ data: SubscriptionPlan[] }> =>
    apiFetch('/admin/plans'),

  adminCreatePlan: (data: {
    name: string
    duration_days: number
    price: number
    storage_limit_mb: number
    file_limit: number | null
  }): Promise<SubscriptionPlan> =>
    apiFetch('/admin/plans', { method: 'POST', body: JSON.stringify(data) }),

  adminUpdatePlan: (planId: number, data: Partial<SubscriptionPlan>): Promise<{ message: string }> =>
    apiFetch(`/admin/plans/${planId}`, { method: 'PATCH', body: JSON.stringify(data) }),

  adminDeletePlan: (planId: number): Promise<null> =>
    apiFetch(`/admin/plans/${planId}`, { method: 'DELETE' }),

  // Admin — Telegram Users
  adminGetTelegramUsers: (page = 1, search = ''): Promise<PaginatedResponse<TelegramUser>> =>
    apiFetch(`/admin/telegram-users?page=${page}&search=${encodeURIComponent(search)}`),

  adminUpdateTelegramStorage: (
    tgId: number,
    data: { storage_limit_mb?: number; file_limit?: number | null }
  ): Promise<{ message: string }> =>
    apiFetch(`/admin/telegram-users/${tgId}/storage`, { method: 'PATCH', body: JSON.stringify(data) }),

  adminTelegramSetSubscription: (
    tgId: number,
    data: { plan_id: number; days?: number; storage_limit_mb?: number; file_limit?: number | null }
  ): Promise<{ message: string }> =>
    apiFetch(`/admin/telegram-users/${tgId}/subscription`, { method: 'POST', body: JSON.stringify(data) }),
}
