// Copyright (c) 2022 Robin Davies
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of
// this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

import { AndroidHostInterface, getAndroidHost } from "./AndroidHost";

export enum ColorTheme {
    Light,
    Dark,
    System
};

export function getEffectiveColorScheme(): ColorTheme {
    let androidHost = (window as any).AndroidHost as AndroidHostInterface;
    if (androidHost) {
        if (androidHost.isDarkTheme)
            return androidHost.isDarkTheme() ? ColorTheme.Dark: ColorTheme.Light;
        return ColorTheme.Dark;
    }
    return getColorScheme();
    
}

export function getColorScheme(): ColorTheme {
    let androidHost = (window as any).AndroidHost as AndroidHostInterface;
    if (androidHost) {
        switch (androidHost.getThemePreference() as number)
        {
            case 0: return ColorTheme.Light;
            case 1: return ColorTheme.Dark;
            default:
            case 2: return ColorTheme.System;
        }
    }
    switch (localStorage.getItem('colorScheme')) {
        case null:
        default:
            return ColorTheme.Light;
        case "Light":
            return ColorTheme.Light;
        case "Dark":
            return ColorTheme.Dark;
        case "System":
            return ColorTheme.System;
    }
}
export function setColorScheme(value: ColorTheme): void {
    let androidHost = (window as any).AndroidHost as AndroidHostInterface;
    if (androidHost) {
        switch (value) {
            case ColorTheme.Light:
                androidHost.setThemePreference(0);
                break;
            case ColorTheme.Dark:
                androidHost.setThemePreference(1);
                break;
            default:
            case ColorTheme.System:
                androidHost.setThemePreference(2);
                break;

        }
    }

    var storageValue;
    switch (value) {
        default:
        case ColorTheme.Light:
            storageValue = "Light";
            break;
        case ColorTheme.Dark:
            storageValue = "Dark";
            break;

        case ColorTheme.System:
            storageValue = "System";
            break;
    }
    localStorage.setItem("colorScheme", storageValue);
}

var gIsDarkTheme: boolean| undefined = undefined;

export function isDarkMode(): boolean {
    if (gIsDarkTheme !== undefined)
    {
        return gIsDarkTheme;
    }
    var colorTheme = getColorScheme();
    if (colorTheme === ColorTheme.System) {
        let androidHost = getAndroidHost();
        if (androidHost)
        {
            if (androidHost.isDarkTheme)
            {
                return gIsDarkTheme = androidHost.isDarkTheme();
            }
            return gIsDarkTheme = true;
        }
        if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
            return gIsDarkTheme = true;
        }
    }
    return gIsDarkTheme = (colorTheme === ColorTheme.Dark);
}

