/** Výčtový typ pro restaurace, pro které umíme získat a parsovat obědové menu. */
export enum Restaurants {
    SLADOVNICKA = 'sladovnicka',
    // UMOTLIKU = 'uMotliku',
    TECHTOWER = 'techTower',
    ZASTAVKAUMICHALA = 'zastavkaUmichala',
    SENKSERIKOVA = 'senkSerikova',
}

export type FoodChoices = {
    trusted: boolean,
    options: number[],
    departureTime?: string,
    note?: string,
}

// TODO okomentovat / rozdělit
export type Choices = {
    [location in LocationKey]?: {
        [login: string]: FoodChoices
    }
}

/** Velikost konkrétní pizzy */
export type PizzaSize = {
    varId: number, // unikátní ID varianty pizzy
    size: string, // velikost pizzy, např. "30cm"
    pizzaPrice: number, // cena samotné pizzy
    boxPrice: number, // cena krabice
    price: number, // celková cena (pizza + krabice)
}

/** Jedna konkrétní pizza */
export type Pizza = {
    name: string, // název pizzy
    ingredients: string[], // seznam ingrediencí
    sizes: PizzaSize[], // dostupné velikosti pizzy
}

/** Objednávka jedné konkrétní pizzy */
export type PizzaOrder = {
    varId: number, // unikátní ID varianty pizzy
    name: string, // název pizzy
    size: string, // velikost pizzy jako string (30cm)
    price: number, // cena pizzy v Kč, včetně krabice
}

/** Celková objednávka jednoho člověka */
export type Order = {
    customer: string, // jméno objednatele
    pizzaList: PizzaOrder[], // seznam objednaných pizz
    fee?: { text?: string, price: number }, // příplatek (např. za extra ingredience)
    totalPrice: number, // celková cena všech objednaných pizz, krabic a příplatků
    hasQr?: boolean, // true, pokud je k objednávce vygenerován QR kód pro platbu
    note?: string, // volitelná uživatelská poznámka k objednávce
}

/** Stav pizza dne */
export enum PizzaDayState {
    NOT_CREATED, // Pizza day nebyl založen
    CREATED, // Pizza day je založen
    LOCKED, // Objednávky uzamčeny
    ORDERED, // Pizzy objednány
    DELIVERED // Pizzy doručeny
}

/** Informace o pizza day pro dnešní den */
interface PizzaDay {
    state: PizzaDayState, // stav pizza dne
    creator: string, // jméno zakladatele
    orders: Order[], // seznam objednávek jednotlivých lidí
}

/** Týdenní menu jednotlivých restaurací. */
export type WeekMenu = {
    [dayIndex: number]: {
        [restaurant in Restaurants]?: DayMenu
    }
}

/** Data vztahující se k jednomu konkrétnímu dni. */
export type DayData = {
    date: string, // datum dne
    isWeekend: boolean, // příznak, zda je datum víkend
    weekIndex: number, // index dne v týdnu (0-6)
    choices: Choices, // seznam voleb uživatelů
    menus?: { [restaurant in Restaurants]?: DayMenu }, // menu jednotlivých restaurací
    pizzaDay?: PizzaDay, // pizza day pro dnešní den, pokud existuje
    pizzaList?: Pizza[], // seznam dostupných pizz pro dnešní den
    pizzaListLastUpdate?: Date, // datum a čas poslední aktualizace pizz
}

/** Veškerá data pro zobrazení na klientovi. */
export type ClientData = DayData & {
    todayWeekIndex?: number, // index dnešního dne v týdnu (0-6)
}

/** Nabídka jídel jednoho podniku pro jeden konkrétní den. */
export type DayMenu = {
    lastUpdate: number, // UNIX timestamp poslední aktualizace menu
    closed: boolean, // příznak, zda je daný podnik v tento den zavřený
    food: Food[], // seznam jídel v menu
}

/** Jídlo z obědového menu restaurace. */
export type Food = {
    amount?: string, // množství standardní porce, např. 0,33l nebo 150g
    name: string, // název/popis jídla
    price: string, // cena ve formátu '135 Kč'
    isSoup: boolean, // příznak, zda se jedná o polévku
}

// TODO tohle je dost špatné pojmenování, vzhledem k tomu co to obsahuje
// TODO pokud by se použilo ovládáni výběru obědu kliknutím, pak bych restaurace z tohoto výčtu vyhodil
export enum Locations {
    SLADOVNICKA = 'Sladovnická',
    // UMOTLIKU = 'U Motlíků',
    TECHTOWER = 'TechTower',
    ZASTAVKAUMICHALA = 'Zastávka u Michala',
    SENKSERIKOVA = 'Pivovarský šenk Šeříková',
    SPSE = 'SPŠE',
    PIZZA = 'Pizza day',
    OBJEDNAVAM = 'Budu objednávat',
    NEOBEDVAM = 'Mám vlastní/neobědvám',
    ROZHODUJI = 'Rozhoduji se',
}

// TODO totéž
export type LocationKey = keyof typeof Locations;

export enum UdalostEnum {
    ZAHAJENA_PIZZA = "Zahájen pizza day",
    OBJEDNANA_PIZZA = "Objednána pizza",
    JDEME_NA_OBED = "Jdeme na oběd",
}

export type NotififaceInput = {
    udalost: UdalostEnum,
    user: string,
}

export type NotifikaceData = {
    input: NotififaceInput,
    gotify?: boolean,
    teams?: boolean,
    ntfy?: boolean,
}

export type GotifyServer = {
    server: string;
    api_keys: string[];
}

/** Čas preferovaného odchodu na oběd. */
export enum DepartureTime {
    T10_00 = "10:00",
    T10_15 = "10:15",
    T10_30 = "10:30",
    T10_45 = "10:45",
    T11_00 = "11:00",
    T11_15 = "11:15",
    T11_30 = "11:30",
    T11_45 = "11:45",
    T12_00 = "12:00",
    T12_15 = "12:15",
    T12_30 = "12:30",
    T12_45 = "12:45",
    T13_00 = "13:00",
}

export enum FeatureRequest {
    CUSTOM_QR = "Ruční generování QR kódů mimo Pizza day (např. při objednávání)",
    FAVORITES = "Možnost označovat si jídla jako oblíbená (taková jídla by se uživateli následně zvýrazňovala)",
    SINGLE_PAYMENT = "Možnost úhrady v podniku za všechny jednou osobou a následné generování QR ostatním",
    NO_WEEKENDS = "Zrušení \"užívejte víkend\", místo toho umožnit zpětně náhled na uplynulý týden",
    QR_FOREVER = "Umožnění zobrazení vygenerovaného QR kódu i po následující dny (dokud ho uživatel ručně \"nezavře\", např. tlačítkem \"Zaplatil jsem\")",
    PIZZA_PICTURES = "Zobrazování náhledů (fotografií) pizz v rámci Pizza day",
    STATISTICS = "Statistiky (nejoblíbenější podnik, nejpopulárnější jídla, nejobjednávanější pizzy, nejčastější uživatelé, ...)",
    RESPONSIVITY = "Vylepšení responzivního designu",
    SECURITY = "Zvýšení zabezpečení aplikace",
    SAFETY = "Zvýšená ochrana proti chybám uživatele (potvrzovací dialogy, překliky, ...)",
    UI = "Celkové vylepšení UI/UX",
    DEVELOPMENT = "Zlepšení dokumentace/postupů pro ostatní vývojáře"
}

export type EasterEgg = {
    path: string;
    url: string;
    startOffset: number;
    endOffset: number;
    duration: number;
    width?: string;
    zIndex?: number;
    position?: "absolute";
    animationName?: string;
    animationDuration?: string;
    animationTimingFunction?: string;
}

// TODO aktuálně se k ničemu nepoužívá
export type AnimationPosition = {
    left?: string,
    startLeft?: string,
    "--start-left"?: string,
    right?: string,
    startRight?: string,
    "--start-right"?: string,
    top?: string,
    startTop?: string,
    "--start-top"?: string,
    bottom?: string,
    startBottom?: string,
    "--start-bottom"?: string,
    endLeft?: string,
    "--end-left"?: string,
    endRight?: string,
    "--end-right"?: string,
    endTop?: string,
    "--end-top"?: string,
    endBottom?: string,
    "--end-bottom"?: string,
    rotate?: string,
}

/** Statistiky pro jeden konkrétní den. */
export type DailyStats = {
    date: string, // zkrácené datum v human-readable formátu (např. 24.02.)
    locations: { [location in LocationKey]?: number }
}

/** Statistiky pro jeden konkrétní týden (pondělí-pátek) */
export type WeeklyStats = [DailyStats, DailyStats, DailyStats, DailyStats, DailyStats];