import { DepartureTime } from "../../types";

const TOKEN_KEY = "token";

/**
 * Uloží token do local storage prohlížeče.
 * 
 * @param token token
 */
export const storeToken = (token: string) => {
    localStorage.setItem(TOKEN_KEY, token);
}

/**
 * Vrátí token z local storage, pokud tam je.
 * 
 * @returns token nebo null
 */
export const getToken = (): string | undefined => {
    return localStorage.getItem(TOKEN_KEY) ?? undefined;
}

/**
 * Odstraní token z local storage, pokud tam je.
 */
export const deleteToken = () => {
    localStorage.removeItem(TOKEN_KEY);
}

/**
 * Vrátí human-readable reprezentaci předaného data a času pro zobrazení.
 * Příklady:
 *  - dnes 10:52
 *  - 10.05.2023 10:52
 */
export function getHumanDateTime(datetime: Date) {
    let hours = String(datetime.getHours()).padStart(2, '0');
    let minutes = String(datetime.getMinutes()).padStart(2, "0");
    if (new Date().toDateString() === datetime.toDateString()) {
        return `dnes ${hours}:${minutes}`;
    } else {
        let day = String(datetime.getDate()).padStart(2, '0');
        let month = String(datetime.getMonth() + 1).padStart(2, "0");
        let year = datetime.getFullYear();
        return `${day}.${month}.${year} ${hours}:${minutes}`;
    }
}

/**
 * Vrátí true, pokud je předaný čas větší než aktuální čas.
 */
export function isInTheFuture(time: DepartureTime) {
    const now = new Date();
    const currentHours = now.getHours();
    const currentMinutes = now.getMinutes();
    const currentDate = now.toDateString();
    const [hours, minutes] = time.split(':').map(Number);

    if (currentDate === now.toDateString()) {
        return hours > currentHours || (hours === currentHours && minutes > currentMinutes);
    }
    return true;
}

/**
 * Vrátí index dne v týdnu, kde pondělí=0, neděle=6
 * 
 * @param date datum
 * @returns index dne v týdnu
 */
export const getDayOfWeekIndex = (date: Date) => {
    // https://stackoverflow.com/a/4467559
    return (((date.getDay() - 1) % 7) + 7) % 7;
}

/** Vrátí první pracovní den v týdnu předaného data. */
export function getFirstWorkDayOfWeek(date: Date) {
    const firstDay = new Date(date);
    firstDay.setDate(date.getDate() - getDayOfWeekIndex(date));
    return firstDay;
}

/** Vrátí poslední pracovní den v týdnu předaného data. */
export function getLastWorkDayOfWeek(date: Date) {
    const lastDay = new Date(date);
    lastDay.setDate(date.getDate() + (4 - getDayOfWeekIndex(date)));
    return lastDay;
}

/** Vrátí datum v ISO formátu. */
export function formatDate(date: Date, format?: string) {
    let day = String(date.getDate()).padStart(2, '0');
    let month = String(date.getMonth() + 1).padStart(2, "0");
    let year = String(date.getFullYear());

    const f = format ?? 'YYYY-MM-DD';
    return f.replace('DD', day).replace('MM', month).replace('YYYY', year);
}

/** Vrátí human-readable reprezentaci předaného data pro zobrazení. */
export function getHumanDate(date: Date) {
    let currentDay = String(date.getDate()).padStart(2, '0');
    let currentMonth = String(date.getMonth() + 1).padStart(2, "0");
    let currentYear = date.getFullYear();
    return `${currentDay}.${currentMonth}.${currentYear}`;
}

/** Převede datum ve formátu YYYY-MM-DD na DD.MM.YYYY */
export function formatDateString(dateString: string): string {
    const [year, month, day] = dateString.split('-');
    return `${day}.${month}.${year}`;
}