/*
   Manual Bookmark implementation

   Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz

   This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. 
   If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

package com.freerdp.freerdpcore.domain;

import android.content.SharedPreferences;
import android.os.Parcel;
import android.os.Parcelable;

public class ManualBookmark extends BookmarkBase {
    public static final Parcelable.Creator<ManualBookmark> CREATOR = new Parcelable.Creator<ManualBookmark>() {
        public ManualBookmark createFromParcel(Parcel in) {
            return new ManualBookmark(in);
        }

        @Override
        public ManualBookmark[] newArray(int size) {
            return new ManualBookmark[size];
        }
    };
    private String hostname;
    private int port;
    private boolean enableGatewaySettings;
    private GatewaySettings gatewaySettings;

    public ManualBookmark(Parcel parcel) {
        super(parcel);
        type = TYPE_MANUAL;
        hostname = parcel.readString();
        port = parcel.readInt();

        enableGatewaySettings = (parcel.readInt() == 1 ? true : false);
        gatewaySettings = parcel.readParcelable(GatewaySettings.class.getClassLoader());
    }

    public ManualBookmark() {
        super();
        init();
    }

    private void init() {
        type = TYPE_MANUAL;
        hostname = "";
        port = 3389;
        enableGatewaySettings = false;
        gatewaySettings = new GatewaySettings();
    }

    public String getHostname() {
        return hostname;
    }

    public void setHostname(String hostname) {
        this.hostname = hostname;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public boolean getEnableGatewaySettings() {
        return enableGatewaySettings;
    }

    public void setEnableGatewaySettings(boolean enableGatewaySettings) {
        this.enableGatewaySettings = enableGatewaySettings;
    }

    public GatewaySettings getGatewaySettings() {
        return gatewaySettings;
    }

    public void setGatewaySettings(GatewaySettings gatewaySettings) {
        this.gatewaySettings = gatewaySettings;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        super.writeToParcel(out, flags);
        out.writeString(hostname);
        out.writeInt(port);
        out.writeInt(enableGatewaySettings ? 1 : 0);
        out.writeParcelable(gatewaySettings, flags);
    }

    @Override
    public void writeToSharedPreferences(SharedPreferences sharedPrefs) {
        super.writeToSharedPreferences(sharedPrefs);

        SharedPreferences.Editor editor = sharedPrefs.edit();
        editor.putString("bookmark.hostname", hostname);
        editor.putInt("bookmark.port", port);
        editor.putBoolean("bookmark.enable_gateway_settings", enableGatewaySettings);
        editor.putString("bookmark.gateway_hostname", gatewaySettings.getHostname());
        editor.putInt("bookmark.gateway_port", gatewaySettings.getPort());
        editor.putString("bookmark.gateway_username", gatewaySettings.getUsername());
        editor.putString("bookmark.gateway_password", gatewaySettings.getPassword());
        editor.putString("bookmark.gateway_domain", gatewaySettings.getDomain());
        editor.commit();
    }

    @Override
    public void readFromSharedPreferences(SharedPreferences sharedPrefs) {
        super.readFromSharedPreferences(sharedPrefs);

        hostname = sharedPrefs.getString("bookmark.hostname", "");
        port = sharedPrefs.getInt("bookmark.port", 3389);
        enableGatewaySettings = sharedPrefs.getBoolean("bookmark.enable_gateway_settings", false);
        gatewaySettings.setHostname(sharedPrefs.getString("bookmark.gateway_hostname", ""));
        gatewaySettings.setPort(sharedPrefs.getInt("bookmark.gateway_port", 443));
        gatewaySettings.setUsername(sharedPrefs.getString("bookmark.gateway_username", ""));
        gatewaySettings.setPassword(sharedPrefs.getString("bookmark.gateway_password", ""));
        gatewaySettings.setDomain(sharedPrefs.getString("bookmark.gateway_domain", ""));
    }

    // Cloneable
    public Object clone() {
        return super.clone();
    }

    // Gateway Settings class
    public static class GatewaySettings implements Parcelable {
        public static final Parcelable.Creator<GatewaySettings> CREATOR = new Parcelable.Creator<GatewaySettings>() {
            public GatewaySettings createFromParcel(Parcel in) {
                return new GatewaySettings(in);
            }

            @Override
            public GatewaySettings[] newArray(int size) {
                return new GatewaySettings[size];
            }
        };
        private String hostname;
        private int port;
        private String username;
        private String password;
        private String domain;

        public GatewaySettings() {
            hostname = "";
            port = 443;
            username = "";
            password = "";
            domain = "";
        }

        public GatewaySettings(Parcel parcel) {
            hostname = parcel.readString();
            port = parcel.readInt();
            username = parcel.readString();
            password = parcel.readString();
            domain = parcel.readString();
        }

        public String getHostname() {
            return hostname;
        }

        public void setHostname(String hostname) {
            this.hostname = hostname;
        }

        public int getPort() {
            return port;
        }

        public void setPort(int port) {
            this.port = port;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public String getDomain() {
            return domain;
        }

        public void setDomain(String domain) {
            this.domain = domain;
        }

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            out.writeString(hostname);
            out.writeInt(port);
            out.writeString(username);
            out.writeString(password);
            out.writeString(domain);
        }
    }
}
