import { colorizeLayers } from './style.js'
import style from './style.js'

const storagePrefix = "maputnik"
const stylePrefix = 'style'
const storageKeys = {
  latest: [storagePrefix, 'latest_style'].join(':'),
  accessToken: [storagePrefix, 'access_token'].join(':')
}

const defaultStyleUrl = "https://raw.githubusercontent.com/osm2vectortiles/mapbox-gl-styles/master/styles/basic-v9-cdn.json"
// Fetch a default style via URL and return it or a fallback style via callback
export function loadDefaultStyle(cb) {
  console.log('Load default style')
  var request = new XMLHttpRequest()
  request.open('GET', defaultStyleUrl, true)

  request.onload = () => {
    if (request.status >= 200 && request.status < 400) {
      cb(style.ensureMetadataExists(JSON.parse(request.responseText)))
    } else {
      cb(style.emptyStyle)
    }
  }

  request.onerror = function() {
      console.log('Could not fetch default style')
      cb(style.emptyStyle)
  }

  request.send()
}

// Return style ids and dates of all styles stored in local storage
function loadStoredStyles() {
  const styles = []
  for (let i = 0; i < window.localStorage.length; i++) {
      const key = window.localStorage.key(i)
      if(isStyleKey(key)) {
        styles.push(fromKey(key))
      }
  }
  return styles
}

function isStyleKey(key) {
  const parts = key.split(":")
  return parts.length == 3 && parts[0] === storagePrefix && parts[1] === stylePrefix
}

// Load style id from key
function fromKey(key) {
  if(!isStyleKey(key)) {
    throw "Key is not a valid style key"
  }

  const parts = key.split(":")
  const styleId = parts[2]
  return styleId
}

// Calculate key that identifies the style with a version
function styleKey(styleId) {
  return [storagePrefix, stylePrefix, styleId].join(":")
}

// Store style independent settings
export class SettingsStore {
  get accessToken() {
    const token = window.localStorage.getItem(storageKeys.accessToken)
    return token ? token : ""
  }
  set accessToken(val) {
    window.localStorage.setItem(storageKeys.accessToken, val)
  }
}

// Manages many possible styles that are stored in the local storage
export class StyleStore {
  // Tile store will load all items from local storage and
  // assume they do not change will working on it
  constructor() {
    this.mapStyles = loadStoredStyles()
  }

  supported(cb) {
    cb(window.localStorage !== undefined)
  }

  // Delete entire style history
  purge() {
    for (let i = 0; i < window.localStorage.length; i++) {
        const key = window.localStorage.key(i)
        if(key.startsWith(storagePrefix)) {
          window.localStorage.removeItem(key)
        }
    }
  }

  // Find the last edited style
  latestStyle(cb) {
    if(this.mapStyles.length === 0) return cb(style.emptyStyle)
    const styleId = window.localStorage.getItem(storageKeys.latest)
    const styleItem = window.localStorage.getItem(styleKey(styleId))

    if(styleItem) return cb(JSON.parse(styleItem))
    cb(style.emptyStyle)
  }

  // Save current style replacing previous version
  save(mapStyle) {
    const key = styleKey(mapStyle.id)
    window.localStorage.setItem(key, JSON.stringify(mapStyle))
    window.localStorage.setItem(storageKeys.latest, mapStyle.id)
    return mapStyle
  }
}
