import { parseCellRange } from '@/component/DualSpreadsheet/utils'
import { MergedCell } from '@/type/template'

export interface ExcelParseResult {
  fileId: string // ID загруженного файла
  data: Record<string, any>
  mergedCells: MergedCell[]
}

export interface ApiUploadResponse {
  file_id: string
  cells: {
    cells: Record<string, any>
    merged: Array<{ from: string; to: string }>
  }
}

export interface ApiFileResponse {
  file: {
    id: string
    name: string
    path: string
    size: number
    template_id: string | null
    created_at: string
    updated_at: string
    deleted_at: string | null
    cells?: {
      cells: Record<string, any>
      merged: Array<{ from: string; to: string }>
    }
  } | null
}

export interface ApiFilesResponse {
  files: Array<{
    id: string
    name: string
    path: string
    size: number
    template_id: string | null
    created_at: string
    updated_at: string
    deleted_at: string | null
  }>
}

// API загрузка файла на сервер
export async function parseExcelFile(
  file: File,
  templateId: string
): Promise<ExcelParseResult> {
  const formData = new FormData()
  formData.append('file', file)

  try {
    const response = await fetch(
      `/api/files/upload?template_id=${templateId}`,
      {
        method: 'POST',
        body: formData,
      }
    )

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }

    const result: ApiUploadResponse = await response.json()

    // Преобразуем ответ API в формат, ожидаемый приложением
    const data = result.cells.cells
    const mergedCells: MergedCell[] = result.cells.merged.map(merge => {
      const range = parseCellRange(`${merge.from}:${merge.to}`)
      return {
        from: merge.from,
        to: merge.to,
        value: data[merge.from] ?? '',
        startRow: range?.startRow ?? 0,
        startCol: range?.startCol ?? 0,
        endRow: range?.endRow ?? 0,
        endCol: range?.endCol ?? 0,
      }
    })

    return {
      fileId: result.file_id, // Добавляем fileId в возвращаемые данные
      data,
      mergedCells,
    }
  } catch (error) {
    console.error('Ошибка при загрузке файла:', error)
    throw new Error('Ошибка при загрузке файла на сервер')
  }
}

// Получение файлов по template_id
export async function getFilesByTemplateId(
  templateId: string
): Promise<ApiFilesResponse['files']> {
  try {
    const response = await fetch('/api/files/', {
      method: 'GET',
    })

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }

    const result: ApiFilesResponse = await response.json()

    // Фильтруем файлы по template_id
    const templateFiles = result.files.filter(
      file => file.template_id === templateId && !file.deleted_at
    )

    return templateFiles
  } catch (error) {
    console.error('Ошибка при получении файлов:', error)
    throw new Error('Ошибка при получении файлов')
  }
}

// Получение последнего файла для шаблона
export async function getLatestFileForTemplate(
  templateId: string
): Promise<ApiFilesResponse['files'][0] | null> {
  try {
    const files = await getFilesByTemplateId(templateId)

    if (files.length === 0) {
      return null
    }

    // Сортируем по дате обновления и берем последний
    const sortedFiles = files.sort(
      (a, b) =>
        new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime()
    )

    return sortedFiles[0]
  } catch (error) {
    console.error('Ошибка при получении последнего файла:', error)
    return null
  }
}

// Получение данных файла по ID
export async function getFileData(fileId: string): Promise<ExcelParseResult> {
  try {
    const response = await fetch(`/api/files/${fileId}`, {
      method: 'GET',
    })

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`)
    }

    const result: ApiFileResponse = await response.json()

    if (!result.file) {
      throw new Error('Файл не найден')
    }

    // Проверяем, есть ли данные ячеек в ответе
    if (!result.file.cells) {
      throw new Error('Данные файла не содержат информации о ячейках')
    }

    // Преобразуем данные в формат, ожидаемый приложением
    const data = result.file.cells.cells
    const mergedCells: MergedCell[] = result.file.cells.merged.map(merge => {
      const range = parseCellRange(`${merge.from}:${merge.to}`)
      return {
        from: merge.from,
        to: merge.to,
        value: data[merge.from] ?? '',
        startRow: range?.startRow ?? 0,
        startCol: range?.startCol ?? 0,
        endRow: range?.endRow ?? 0,
        endCol: range?.endCol ?? 0,
      }
    })

    return {
      fileId: result.file.id,
      data,
      mergedCells,
    }
  } catch (error) {
    console.error('Ошибка при получении данных файла:', error)
    throw new Error('Ошибка при получении данных файла')
  }
}
