<template>
    <div class="fc-container">
        <el-scrollbar>
            <el-alert title="Warning" type="warning" :closable="false" show-icon>
                This page is designed for developers. Some of the buttons here can break your Northstar install if you do not know what you're doing!
            </el-alert>

            <h3>Basic:</h3>

            <el-button type="primary" @click="disableDevMode">
                Disable developer mode
            </el-button>

            <el-button type="primary" @click="crashApplication">
                Panic button
            </el-button>

            <h3>Linux:</h3>

            <el-button type="primary" @click="checkLinuxCompatibility">
                Check NSProton Compatibility
            </el-button>

            <el-button type="primary" @click="installNSProton">
                Install NSProton
            </el-button>

            <el-button type="primary" @click="uninstallNSProton">
                Remove NSProton
            </el-button>

            <el-button type="primary" @click="getLocalNSProtonVersion">
                Get local NSProton Version
            </el-button>

            <h3>Testing:</h3>

            <el-button type="primary" @click="launchGameWithoutChecks">
                Launch Northstar (bypass all checks)
            </el-button>

            <el-button type="primary" @click="launchGameViaSteam">
                Launch Northstar via Steam
            </el-button>

            <el-button type="primary" @click="installLauncherGitMain">
                Install launcher from main branch
            </el-button>

            <br />
            <br />

            <el-button type="primary" @click="getAvailableNorthstarVersions">
                Get available versions
            </el-button>

            <el-select v-model="selected_ns_version" class="m-2" placeholder="Versions">
                <el-option
                    v-for="item in ns_versions"
                    :key="item.value"
                    :label="item.label"
                    :value="item"
                />
            </el-select>

            <el-button type="primary" @click="installNorthstarVersion">
                Install
            </el-button>

            <h3>Repair:</h3>


            <el-button type="primary" @click="getInstalledMods">
                Get installed mods
            </el-button>

            <h3>Testing</h3>
            <pull-requests-selector />

            <h3>Mod install:</h3>

            <el-input v-model="mod_to_install_field_string" placeholder="Please input Thunderstore dependency string (example: AuthorName-ModName-1.2.3)" clearable />

            <el-button type="primary" @click="installMod">
                Install mod
            </el-button>

            <h3>Release management</h3>
            <el-select v-model="selected_project" placeholder="Select">
            <el-option
                v-for="item in project"
                :key="item.value"
                :label="item.label"
                :value="item.value"
                />
            </el-select>            
            <el-button type="primary" @click="getTags">
                Get tags
            </el-button>

            <el-select v-model="firstTag" class="m-2" placeholder="First tag">
                <el-option
                    v-for="item in ns_release_tags"
                    :key="item.value"
                    :label="item.label"
                    :value="item"
                />
            </el-select>
            <el-select v-model="secondTag" class="m-2" placeholder="Second tag">
                <el-option
                    v-for="item in ns_release_tags"
                    :key="item.value"
                    :label="item.label"
                    :value="item"
                />
            </el-select>

            <el-button type="primary" @click="compareTags">
                Compare Tags
            </el-button>

            <el-button type="primary" @click="copyReleaseNotesToClipboard">
                Copy to clipboard
            </el-button>

            <el-input
                v-model="release_notes_text"
                type="textarea"
                :rows="5"
                placeholder="Output"
            />
        </el-scrollbar>
    </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";
import { invoke } from "@tauri-apps/api";
import { TagWrapper } from "../../../src-tauri/bindings/TagWrapper";
import { NorthstarThunderstoreReleaseWrapper } from "../../../src-tauri/bindings/NorthstarThunderstoreReleaseWrapper";
import PullRequestsSelector from "../components/PullRequestsSelector.vue";
import { showErrorNotification, showNotification } from "../utils/ui";
import { Project } from "../../../src-tauri/bindings/Project"

export default defineComponent({
    name: "DeveloperView",
    components: {
        PullRequestsSelector
    },
    data() {
        return {
            mod_to_install_field_string: "",
            release_notes_text: "",
            first_tag: { label: '', value: { name: '' } },
            second_tag: { label: '', value: { name: '' } },
            ns_release_tags: [] as TagWrapper[],
            ns_versions: [] as NorthstarThunderstoreReleaseWrapper[],
            selected_ns_version: { label: '', value: { package: '', version: '' } } as NorthstarThunderstoreReleaseWrapper,
            selected_project: "FlightCore",
            project: [
                {
                    value: 'FlightCore',
                    label: 'FlightCore',
                },
                {
                    value: 'Northstar',
                    label: 'Northstar',
                }
            ],
        }
    },
    computed: {
        firstTag: {
            get(): TagWrapper {
                return this.first_tag;
            },
            set(value: TagWrapper) {
                this.first_tag = value;
            }
        },
        secondTag: {
            get(): TagWrapper {
                return this.second_tag;
            },
            set(value: TagWrapper) {
                this.second_tag = value;
            }
        },
    },
    methods: {
        disableDevMode() {
            this.$store.commit('toggleDeveloperMode');
        },
        async crashApplication() {
            await invoke("force_panic");
            showErrorNotification("Never should have been able to get here!");
        },
        async checkLinuxCompatibility() {
            await invoke("linux_checks")
                .then(() => {
                    showNotification('Linux compatible', 'All checks passed');
                })
                .catch((error) => {
                    showNotification('Not Linux compatible', error, 'error');
                    console.error(error);
                });
        },
        async launchGameWithoutChecks() {
            this.$store.commit('launchGame', true);
        },
        async launchGameViaSteam() {
            this.$store.commit('launchGameSteam', true);
        },
        async getInstalledMods() {
            await invoke("get_installed_mods_and_properties", { gameInstall: this.$store.state.game_install }).then((message) => {
                // Simply console logging for now
                // In the future we should display the installed mods somewhere
                console.log(message);

                // Just a visual indicator that it worked
                showNotification('Success');
            })
                .catch((error) => {
                    showErrorNotification(error);
                });
        },
        async installMod() {
            let mod_to_install = this.mod_to_install_field_string;
            await invoke<string>("install_mod_caller", { gameInstall: this.$store.state.game_install, thunderstoreModString: mod_to_install }).then((message) => {
                // Show user notification if mod install completed.
                showNotification(`Installed ${mod_to_install}`, message);
            })
                .catch((error) => {
                    showErrorNotification(error);
                });
        },
        async getTags() {
            await invoke<TagWrapper[]>("get_list_of_tags", { project: this.selected_project })
                .then((message) => {
                    this.ns_release_tags = message;
                    showNotification("Done", "Fetched tags");
                    this.first_tag = this.ns_release_tags[1];
                    this.second_tag = this.ns_release_tags[0];
                    this.compareTags();
                })
                .catch((error) => {
                    showErrorNotification(error);
                });
        },
        async compareTags() {
            await invoke<string>("compare_tags", { project: this.selected_project, firstTag: this.firstTag.value, secondTag: this.secondTag.value })
                .then((message) => {
                    this.release_notes_text = message;
                    showNotification("Done", "Generated release notes");
                    this.copyReleaseNotesToClipboard();
                })
                .catch((error) => {
                    showErrorNotification(error);
                });
        },
        async installLauncherGitMain() {

            const notification = showNotification(`Installing git main`, 'Please wait', 'info', 0);

            await invoke<string>("install_git_main", { gameInstallPath: this.$store.state.game_install.game_path })
                .then((message) => {
                    this.release_notes_text = message;
                    showNotification("Done", `Installed launcher build from ${message}`);
                })
                .catch((error) => {
                    showErrorNotification(error);
                })
                .finally(() => {
                    // Clear old notification
                    notification.close();
                });
        },
        async getAvailableNorthstarVersions() {
            await invoke<NorthstarThunderstoreReleaseWrapper[]>("get_available_northstar_versions")
                .then((message) => {
                    this.ns_versions = message;
                    showNotification("Done", "Fetched all available Northstar versions");
                })
                .catch((error) => {
                    showErrorNotification(error);
                });
        },
        async installNorthstarVersion() {
            // Send notification telling the user to wait for the process to finish
            const notification = showNotification(
                `Installing Northstar version v${this.selected_ns_version.value.version}`,
                "Please wait",
                'info',
                0
            );

            let install_northstar_result = invoke("install_northstar_caller", { gameInstall: this.$store.state.game_install, northstarPackageName: this.selected_ns_version.value.package, versionNumber: this.selected_ns_version.value.version });

            await install_northstar_result
                .then((message) => {
                    // Send notification
                    showNotification(this.$t('generic.done'), this.$t('settings.repair.window.reinstall_success'));
                    this.$store.commit('checkNorthstarUpdates');
                })
                .catch((error) => {
                    showErrorNotification(error);
                    console.error(error);
                })
                .finally(() => {
                    // Clear old notification
                    notification.close();
                });
        },
        async installNSProton() {
            showNotification(`Started NSProton install`);
            await invoke("install_northstar_proton_wrapper")
                .then((message) => { showNotification(`Done`); })
                .catch((error) => { showNotification(`Error`, error, "error"); })
        },
        async uninstallNSProton() {
            await invoke("uninstall_northstar_proton_wrapper")
                .then((message) => { showNotification(`Done`); })
                .catch((error) => { showNotification(`Error`, error, "error"); })
        },
        async getLocalNSProtonVersion() {
            await invoke("get_local_northstar_proton_wrapper_version")
                .then((message) => { showNotification(`NSProton Version`, message as string); })
                .catch((error) => { showNotification(`Error`, error, "error"); })
        },
        async copyReleaseNotesToClipboard() {
            navigator.clipboard.writeText(this.release_notes_text)
                .then(() => {
                    showNotification("Copied to clipboard");
                })
                .catch(() => {
                    showErrorNotification("Failed copying to clipboard");
                });
        },
    }
});
</script>

<style scoped>
</style>
