// API типы для работы с листами
export interface CreateSheetInput {
  name: string
  cells: Record<string, any>
  template_id: string
}

export interface CreateSheetOutput {
  id: string
}

export interface GetSheetsOutput {
  sheets: ApiSheet[]
}

export interface GetSheetOutput {
  sheet: ApiSheet | null
}

export interface PatchSheetInput {
  name?: string | null
  cells?: Record<string, any> | null
}

export interface PatchSheetOutput {
  id: string
}

export interface ApiSheet {
  id: string
  name: string
  cells: Record<string, any>
  template_id: string
  created_at: string
  updated_at: string
  deleted_at?: string | null
}

// API создание листа
export async function createSheet(
  sheet: CreateSheetInput
): Promise<CreateSheetOutput> {
  try {
    const response = await fetch('/api/sheets/', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(sheet),
    })

    if (!response.ok) {
      // Пытаемся получить подробности ошибки от сервера
      let errorDetails = `HTTP error! status: ${response.status}`
      try {
        const errorData = await response.json()
        console.error('❌ Детали ошибки сервера:', errorData)
        errorDetails += ` - ${JSON.stringify(errorData)}`
      } catch (e) {
        console.error('❌ Не удалось получить детали ошибки')
      }
      throw new Error(errorDetails)
    }

    const result: CreateSheetOutput = await response.json()
    return result
  } catch (error) {
    console.error('Ошибка при создании листа:', error)
    throw new Error('Ошибка при создании листа на сервере')
  }
}

// API получение всех листов
export async function getSheets(): Promise<GetSheetsOutput> {
  try {
    const response = await fetch('/api/sheets/', {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
      },
    })

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

    const result: GetSheetsOutput = await response.json()
    return result
  } catch (error) {
    console.error('Ошибка при получении листов:', error)
    throw new Error('Ошибка при получении листов с сервера')
  }
}

// API получение листов для конкретного шаблона
export async function getSheetsByTemplate(
  templateId: string
): Promise<GetSheetsOutput> {
  try {
    // Получаем все листы и фильтруем на клиенте
    const response = await fetch(`/api/sheets/`, {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
      },
    })

    if (!response.ok) {
      // Пытаемся получить подробности ошибки от сервера
      let errorDetails = `HTTP error! status: ${response.status}`
      try {
        const errorData = await response.json()
        console.error('❌ Детали ошибки при получении листов:', errorData)
        errorDetails += ` - ${JSON.stringify(errorData)}`
      } catch (e) {
        console.error(
          '❌ Не удалось получить детали ошибки при получении листов'
        )
      }
      throw new Error(errorDetails)
    }

    const allSheets: GetSheetsOutput = await response.json()

    // Фильтруем листы по template_id на клиенте
    const filteredSheets = allSheets.sheets.filter(
      sheet => sheet.template_id === templateId
    )

    // console.log('✅ Получены и отфильтрованы листы для шаблона:', {
    //   templateId,
    //   totalSheets: allSheets.sheets.length,
    //   filteredSheetsCount: filteredSheets.length,
    //   sheetNames: filteredSheets.map(s => s.name),
    // })

    return { sheets: filteredSheets }
  } catch (error) {
    console.error('❌ Ошибка при получении листов шаблона:', error)

    // Если ошибка 404 или подобная, возвращаем пустой список вместо выброса ошибки
    if (error instanceof Error && error.message.includes('404')) {
      // console.log('📭 Листы для шаблона не найдены, возвращаем пустой список')
      return { sheets: [] }
    }

    throw new Error('Ошибка при получении листов шаблона с сервера')
  }
}

// API получение конкретного листа
export async function getSheet(sheetId: string): Promise<GetSheetOutput> {
  try {
    const response = await fetch(`/api/sheets/${sheetId}`, {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
      },
    })

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

    const result: GetSheetOutput = await response.json()
    return result
  } catch (error) {
    console.error('Ошибка при получении листа:', error)
    throw new Error('Ошибка при получении листа с сервера')
  }
}

// API обновление листа
export async function patchSheet(
  sheetId: UUID,
  sheet: PatchSheetInput
): Promise<PatchSheetOutput> {
  try {
    if (process.env.NODE_ENV !== 'production') {
      console.log('PATCH BODY:', sheet)
    }
    const response = await fetch(`/api/sheets/${sheetId}`, {
      method: 'PATCH',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(sheet),
    })

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

    const result: PatchSheetOutput = await response.json()
    return result
  } catch (error) {
    console.error('Ошибка при обновлении листа:', error)
    throw new Error('Ошибка при обновлении листа на сервере')
  }
}
