/**
 * Copyright (c) 2013, Redsolution LTD. All rights reserved.
 *
 * This file is part of Xabber project; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License, Version 3.
 *
 * Xabber is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License,
 * along with this program. If not, see http://www.gnu.org/licenses/.
 */
package com.xabber.android.ui;

import java.util.NoSuchElementException;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.xabber.android.data.connection.CertificateInvalidReason;
import com.xabber.android.data.connection.CertificateManager;
import com.xabber.android.data.connection.ConnectionManager;
import com.xabber.android.data.connection.PendingCertificate;
import com.xabber.android.data.intent.SegmentIntentBuilder;
import com.xabber.android.ui.helper.ManagedDialog;
import com.xabber.androiddev.R;

/**
 * Dialog to confirm invalid certificate.
 *
 * @author alexander.ivanov
 */
public class CertificateConfirmation extends ManagedDialog {

    private static final String SAVED_SHOW_DETAILS = "com.xabber.android.ui.CertificateConfirmation.SHOW_DETAILS";

    private PendingCertificate pendingCertificate;
    private boolean showDetails;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String fingerprint = getFingerprint(getIntent());
        CertificateInvalidReason reason = getReason(getIntent());
        pendingCertificate = null;
        if (fingerprint != null && reason != null)
            pendingCertificate = CertificateManager.getInstance()
                    .getPendingCertificate(fingerprint, reason);
        if (pendingCertificate == null)
            finish();
        if (savedInstanceState == null) {
            showDetails = false;
        } else {
            showDetails = savedInstanceState.getBoolean(SAVED_SHOW_DETAILS,
                    false);
        }
        ((Button) findViewById(android.R.id.button3))
                .setText(R.string.certificate_show_details);
        setDialogTitle(R.string.INVALID_CERTIFICATE);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(SAVED_SHOW_DETAILS, showDetails);
    }

    @Override
    protected void onResume() {
        super.onResume();
        update();
    }

    private void update() {
        String reason = getString(pendingCertificate.getReason()
                .getResourceId());
        String message = getString(R.string.certificate_confirmation, reason,
                CertificateManager.showFingerprint(pendingCertificate
                        .getFingerprint()));
        if (showDetails) {
            String details = getString(R.string.certificate_details,
                    pendingCertificate.getIssuerCommonName(),
                    pendingCertificate.getIssuerOrganization(),
                    pendingCertificate.getIssuerOrganizationlUnit(),
                    pendingCertificate.getSerialNumber(),
                    pendingCertificate.getSubjectCommonName(),
                    pendingCertificate.getSubjectOrganization(),
                    pendingCertificate.getSubjectOrganizationlUnit(),
                    pendingCertificate.issuedOn(),
                    pendingCertificate.expiresOn());
            message += details;
            findViewById(android.R.id.button3).setVisibility(View.GONE);
        }
        ((TextView) findViewById(android.R.id.message)).setText(message);
    }

    @Override
    public void onAccept() {
        super.onAccept();
        CertificateManager.getInstance().accept(
                pendingCertificate.getFingerprint(),
                pendingCertificate.getReason());
        ConnectionManager.getInstance().updateConnections(true);
        finish();
    }

    @Override
    public void onDecline() {
        super.onDecline();
        CertificateManager.getInstance().discard(
                pendingCertificate.getFingerprint(),
                pendingCertificate.getReason());
        finish();
    }

    @Override
    public void onCenter() {
        super.onCenter();
        showDetails = true;
        update();
    }

    public static Intent createIntent(Context context, String fingerPrint,
                                      CertificateInvalidReason reason) {
        return new SegmentIntentBuilder<SegmentIntentBuilder<?>>(context,
                CertificateConfirmation.class).addSegment(fingerPrint)
                .addSegment(reason.toString()).build();
    }

    private static String getFingerprint(Intent intent) {
        return SegmentIntentBuilder.getSegment(intent, 0);
    }

    private static CertificateInvalidReason getReason(Intent intent) {
        String value = SegmentIntentBuilder.getSegment(intent, 1);
        if (value != null)
            try {
                return CertificateInvalidReason.valueOf(value);
            } catch (NoSuchElementException e) {
            }
        return null;
    }

}
