// Базовый URL API (берётся из внешнего config.js)
const API_BASE = window.APP_CONFIG?.API_BASE || ''

// Формирование полного URL (добавляет домен к относительным путям)
export const getFullUrl = (url) => {
  if (!url) return ''
  if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('data:')) {
    return url
  }
  return API_BASE + url
}

// Базовая функция запроса с глобальной проверкой сессии
const request = async (endpoint, options = {}, skipSessionCheck = false) => {
  const res = await fetch(`${API_BASE}${endpoint}`, options)
  const data = await res.json()
  
  // Глобальная проверка: если сессия истекла — редирект на логин
  // Пропускаем для эндпоинтов авторизации/регистрации
  if (!skipSessionCheck && data.success === false && data.errors?.session) {
    // Очищаем кэш авторизации (через window чтобы избежать циклической зависимости)
    if (window.__clearAuthCache) window.__clearAuthCache()
    // Редирект на логин (если ещё не там)
    if (window.location.pathname !== '/login') {
      window.location.href = '/login'
    }
  }
  
  return data
}

// ==================== AUTH ====================
export const authApi = {
  login: (username, password) => request('/api/user', { 
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'auth_login', username, password }) 
  }, true), // skipSessionCheck — это авторизация
  register: ({ name, username, password, telegram }) => request('/api/user', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'create_user', name, username, password, telegram })
  }, true), // skipSessionCheck — это регистрация
  check: () => request('/api/user', { 
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'check_session' }) 
  }, true), // skipSessionCheck — это проверка сессии
  logout: () => request('/api/user', { 
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'logout' }) 
  }, true), // skipSessionCheck — это выход
  logoutAll: () => request('/api/user', { 
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'logout_all' }) 
  }, true) // skipSessionCheck — выход со всех устройств
}

// ==================== PROJECTS ====================
export const projectsApi = {
  // active: ID проекта для загрузки данных (опционально)
  getAll: (active = null) => {
    let url = '/api/project'
    if (active) url += `?active=${active}`
    return request(url, { credentials: 'include' })
  },
  // Получение данных проекта (проект + колонки + отделы)
  getData: (id_project) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'get_project_data', id_project })
  }),
  // Создание проекта
  create: (name) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'create', name })
  }),
  // Обновление проекта
  update: (id, name) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'update', id, name })
  }),
  // Удаление проекта
  delete: (id) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'delete', id })
  }),
  // Обновление порядка проектов
  updateOrder: (ids) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'update_order', ids })
  }),
  // ==================== КОЛОНКИ ====================
  // Добавление колонки
  addColumn: (project_id, name, color) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'add_column', project_id, name, color })
  }),
  // Обновление колонки
  updateColumn: (id, name, color) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'update_column', id, name, color })
  }),
  // Получение количества задач в колонке
  getColumnTasksCount: (id) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'get_column_tasks_count', id })
  }),
  // Удаление колонки
  deleteColumn: (id) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'delete_column', id })
  }),
  // Обновление порядка колонок
  updateColumnsOrder: (project_id, ids) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'update_columns_order', project_id, ids })
  }),
  // Установка финальной колонки
  setReadyColumn: (project_id, column_id) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'set_ready_column', project_id, column_id })
  }),
  // ==================== ОТДЕЛЫ ====================
  // Добавление отдела
  addDepartment: (project_id, name, color) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'add_department', project_id, name, color })
  }),
  // Обновление отдела
  updateDepartment: (id, name, color) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'update_department', id, name, color })
  }),
  // Получение количества задач в отделе
  getDepartmentTasksCount: (id) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'get_department_tasks_count', id })
  }),
  // Удаление отдела
  deleteDepartment: (id) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'delete_department', id })
  }),
  // Обновление порядка отделов
  updateDepartmentsOrder: (project_id, ids) => request('/api/project', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'update_departments_order', project_id, ids })
  })
}

// ==================== CARDS ====================
export const cardsApi = {
  // id_project: ID проекта (обязательный)
  // archive: 0 = неархивные (по умолчанию), 1 = архивные, 'all' = все
  getAll: (id_project, archive = 0) => {
    let url = `/api/task?id_project=${id_project}`
    if (archive !== 0) url += `&archive=${archive}`
    return request(url, { credentials: 'include' })
  },
  updateOrder: (id, column_id, to_index) => request('/api/task', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'update_order', id, column_id, to_index })
  }),
  create: (data) => request('/api/task', { 
    method: 'POST', 
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'create', ...data }) 
  }),
  update: (data) => request('/api/task', { 
    method: 'POST', 
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'update', ...data }) 
  }),
  delete: (id) => request('/api/task', { 
    method: 'POST', 
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'delete', id })
  }),
  setArchive: (id, archive = 1) => request('/api/task', { 
    method: 'POST', 
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'set_archive', id, archive })
  })
}

// ==================== TASK IMAGES ====================
export const taskImageApi = {
  upload: (task_id, file_data, file_name) => request('/api/task', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'upload_image', task_id, file_data, file_name })
  }),
  // Принимает строку (один файл) или массив (несколько файлов)
  delete: (task_id, file_names) => request('/api/task', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'delete_image', task_id, file_names })
  })
}

// ==================== COMMENT IMAGES ====================
export const commentImageApi = {
  upload: (comment_id, file_data, file_name) => request('/api/comment', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'upload_image', comment_id, file_data, file_name })
  }),
  // Принимает строку (один файл) или массив (несколько файлов)
  delete: (comment_id, file_names) => request('/api/comment', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'delete_image', comment_id, file_names })
  })
}

// ==================== USERS ====================
export const usersApi = {
  // Получить участников проекта (id_project обязателен)
  getAll: (id_project) => request(`/api/user?id_project=${id_project}`, { credentials: 'include' }),
  
  // Поиск пользователя по логину
  search: (username) => request('/api/user', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'search', username })
  })
}

// ==================== PROJECT INVITES ====================
export const projectInviteApi = {
  // Получить свои pending-приглашения
  getMyPending: () => request('/api/projectInvite', { credentials: 'include' }),

  // Получить количество pending-приглашений
  getCount: () => request('/api/projectInvite', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'get_count' })
  }),

  // Отправить приглашение
  send: (project_id, user_id, is_admin = false, permissions = null) => request('/api/projectInvite', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'send', project_id, user_id, is_admin, permissions })
  }),

  // Проверить, есть ли pending-приглашение
  checkPending: (project_id, user_id) => request('/api/projectInvite', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'check_pending', project_id, user_id })
  }),

  // Получить pending-приглашения проекта (для админа)
  getProjectPending: (project_id) => request('/api/projectInvite', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'get_project_pending', project_id })
  }),

  // Принять приглашение
  accept: (invite_id) => request('/api/projectInvite', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'accept', invite_id })
  }),

  // Отклонить приглашение
  decline: (invite_id) => request('/api/projectInvite', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'decline', invite_id })
  }),

  // Отменить приглашение (для админа)
  cancel: (invite_id, project_id) => request('/api/projectInvite', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'cancel', invite_id, project_id })
  })
}

// ==================== PROJECT ACCESS ====================
export const projectAccessApi = {
  // Добавление участника напрямую (используется после принятия инвайта — внутренний метод)
  addMember: (project_id, user_id, is_admin = false, permissions = null) => request('/api/projectAccess', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'add_member', project_id, user_id, is_admin, permissions })
  }),

  // Обновление прав участника
  updateMember: (project_id, user_id, { is_admin, permissions } = {}) => request('/api/projectAccess', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'update_member', project_id, user_id, is_admin, permissions })
  }),

  // Удаление участника из проекта
  removeMember: (project_id, user_id) => request('/api/projectAccess', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'remove_member', project_id, user_id })
  })
}

// ==================== SERVER ====================
export const serverApi = {
  // Получение настроек сервера (timezone и т.д.) — публичный action
  getSettings: () => request('/api/server', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'get_settings' })
  })
}

// Хранилище серверных настроек
export const serverSettings = {
  timezoneOffset: '+03:00',  // дефолт, обновится при загрузке
  
  // Инициализация — вызвать один раз при старте приложения
  async init() {
    try {
      const result = await serverApi.getSettings()
      if (result.success) {
        this.timezoneOffset = result.data.timezone_offset
      }
    } catch (e) {
      console.warn('Не удалось получить настройки сервера:', e)
    }
  },
  
  // Парсинг даты с сервера с учётом таймзоны
  parseDate(dateStr) {
    if (!dateStr) return null
    // Добавляем таймзону сервера для корректного парсинга
    let normalized = dateStr.replace(' ', 'T')
    // Если уже есть таймзона — не добавляем
    if (normalized.includes('+') || normalized.includes('Z')) {
      return new Date(normalized)
    }
    // Если нет времени (только дата YYYY-MM-DD) — добавляем 00:00:00
    if (normalized.length === 10) {
      normalized += 'T00:00:00'
    }
    return new Date(normalized + this.timezoneOffset)
  }
}

// ==================== COMMENTS ====================
export const commentsApi = {
  // Получение комментариев задачи
  getByTask: (id_task) => request(`/api/comment?id_task=${id_task}`, { credentials: 'include' }),
  
  // Создание комментария (id_answer — опционально, для ответа на комментарий)
  create: (id_task, text, id_answer = null) => request('/api/comment', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'create', id_task, text, id_answer })
  }),
  
  // Обновление комментария
  update: (id, text) => request('/api/comment', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'update', id, text })
  }),
  
  // Удаление комментария
  delete: (id) => request('/api/comment', {
    method: 'POST',
    credentials: 'include',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ action: 'delete', id })
  })
}