/** 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',
}

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

export interface Choices {
    [location: string]: {
        [login: string]: FoodChoices
    },
}

/** Velikost konkrétní pizzy */
export interface 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 interface Pizza {
    name: string, // název pizzy
    ingredients: string[], // seznam ingrediencí
    sizes: PizzaSize[], // dostupné velikosti pizzy
}

/** Objednávka jedné konkrétní pizzy */
export interface 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 interface 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 interface WeekMenu {
    [dayIndex: number]: {
        [restaurant in Restaurants]?: DayMenu
    }
}

/** Data vztahující se k jednomu konkrétnímu dni. */
export interface 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 interface ClientData extends 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 interface 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 interface 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
export enum Locations {
    SLADOVNICKA = 'Sladovnická',
    // UMOTLIKU = 'U Motlíků',
    TECHTOWER = 'TechTower',
    SPSE = 'SPŠE',
    PIZZA = 'Pizza day',
    OBJEDNAVAM = 'Budu objednávat',
    NEOBEDVAM = 'Mám vlastní/neobědvám',
    ROZHODUJI = 'Rozhoduji se',
}

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

export interface NotififaceInput {
    udalost: UdalostEnum,
    user: string,
}

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

export interface 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 interface 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,
}