// Calendar

import { useEffect, useState } from 'preact/hooks'

export const WEEK_DAYS = [
    'Domenica',
    'Lunedì',
    'Martedì',
    'Mercoledì',
    'Giovedì',
    'Venerdì',
    'Sabato',
]

// Hashing

export function hashString(str, seed = 0) {
    let h1 = 0xdeadbeef ^ seed,
        h2 = 0x41c6ce57 ^ seed
    for (let i = 0, ch; i < str.length; i++) {
        ch = str.charCodeAt(i)
        h1 = Math.imul(h1 ^ ch, 2654435761)
        h2 = Math.imul(h2 ^ ch, 1597334677)
    }
    h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909)
    h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909)
    return 4294967296 * (2097151 & h2) + (h1 >>> 0)
}

// Courses

export function prettyCourseName(name) {
    return name
        .split(' ')
        .map(word => word.toLowerCase())
        .map(word => {
            if (word.trim().length === 0) return word

            return /(^del|^nel|^di$|^dei$|^con$|^alla$|^per$|^e$|^la$)/.test(word)
                ? word
                : word[0].toUpperCase() + word.slice(1)
        })
        .join(' ')
        .replaceAll('Ii', 'II')
        .replaceAll('Iii', 'III')
        .replaceAll(/'(.)/g, ({}, letter) => "'" + letter.toUpperCase())
}

export function prettyAulaName(name) {
    return name.replace('FIB', 'Fib').replace(/([A-Z0-9])\-LAB/, 'Lab $1')
}

export function prettyProfName(nome, cognome) {
    return (nome + ' ' + cognome)
        .split(/\b/)
        .map(word => _.capitalize(word))
        .join('')
}

// JSX

export const withClasses = classes =>
    Array.isArray(classes)
        ? classes.filter(e => !!e).join(' ')
        : Object.entries(classes)
              .filter(([, value]) => value)
              .map(([key]) => key)
              .join(' ')

// Hooks

export const usePersistentState = (key, initialValue) => {
    const previousValue = localStorage.getItem(key)

    const [value, setValue] = useState(
        previousValue !== null ? JSON.parse(previousValue) : initialValue
    )

    useEffect(() => {
        localStorage.setItem(key, JSON.stringify(value))
    }, [value])

    return [value, setValue]
}
