/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.ide.eclipse.adt.internal.editors.draw9patch;

import static com.android.SdkConstants.DOT_9PNG;
import com.android.ide.eclipse.adt.AdtPlugin;
import com.android.ide.eclipse.adt.internal.editors.draw9patch.graphics.NinePatchedImage;
import com.android.ide.eclipse.adt.internal.editors.draw9patch.ui.ImageViewer;
import com.android.ide.eclipse.adt.internal.editors.draw9patch.ui.MainFrame;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.dialogs.SaveAsDialog;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.FileEditorInput;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

/**
 * Draw9Patch editor part.
 */
public class Draw9PatchEditor extends EditorPart implements ImageViewer.UpdateListener {

    private IProject mProject = null;

    private FileEditorInput mFileEditorInput = null;

    private String mFileName = null;

    private NinePatchedImage mNinePatchedImage = null;

    private MainFrame mMainFrame = null;

    @Override
    public void init(IEditorSite site, IEditorInput input) throws PartInitException {
        setSite(site);
        setInput(input);
        setPartName(input.getName());

        // The contract of init() mentions we need to fail if we can't
        // understand the input.
        if (input instanceof FileEditorInput) {
            // We try to open a file that is part of the current workspace
            mFileEditorInput = (FileEditorInput) input;
            mFileName = mFileEditorInput.getName();
            mProject = mFileEditorInput.getFile().getProject();
        } else {
            throw new PartInitException("Input is not of type FileEditorInput " + //$NON-NLS-1$
                    "nor FileStoreEditorInput: " + //$NON-NLS-1$
                    input == null ? "null" : input.toString()); //$NON-NLS-1$
        }

    }

    @Override
    public boolean isSaveAsAllowed() {
        return true;
    }

    @Override
    public void doSaveAs() {
        IPath relativePath = null;
        if ((relativePath = showSaveAsDialog()) != null) {
            mFileEditorInput = new FileEditorInput(ResourcesPlugin.getWorkspace().getRoot()
                    .getFile(relativePath));
            mFileName = mFileEditorInput.getName();
            setInput(mFileEditorInput);

            doSave(new NullProgressMonitor());
        }
    }

    @Override
    public void doSave(final IProgressMonitor monitor) {
        boolean hasNinePatchExtension = mFileName.endsWith(DOT_9PNG);
        boolean doConvert = false;

        if (!hasNinePatchExtension) {
            String patchedName = NinePatchedImage.getNinePatchedFileName(mFileName);
            doConvert = MessageDialog
                    .openQuestion(AdtPlugin.getDisplay().getActiveShell(),
                            "Warning",
                            String.format(
                                    "The file \"%s\" doesn't seem to be a 9-patch file. \n"
                                            + "Do you want to convert and save as \"%s\" ?",
                                    mFileName, patchedName));

            if (doConvert) {
                IFile destFile = mProject.getFile(NinePatchedImage.getNinePatchedFileName(
                        mFileEditorInput.getFile().getProjectRelativePath().toOSString()));
                if (!destFile.exists()) {
                    mFileEditorInput = new FileEditorInput(destFile);
                    mFileName = mFileEditorInput.getName();
                } else {
                    IPath relativePath = null;
                    if ((relativePath = showSaveAsDialog()) != null) {
                        mFileEditorInput = new FileEditorInput(ResourcesPlugin.getWorkspace()
                                .getRoot().getFile(relativePath));
                        mFileName = mFileEditorInput.getName();
                    } else {
                        doConvert = false;
                    }
                }
            }
        }

        if (hasNinePatchExtension || doConvert) {
            ImageLoader loader = new ImageLoader();
            loader.data = new ImageData[] {
                mNinePatchedImage.getRawImageData()
            };

            IFile file = mFileEditorInput.getFile();

            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            loader.save(outputStream, SWT.IMAGE_PNG);
            byte[] byteArray = outputStream.toByteArray();

            try {
                if (file.exists()) {
                    file.setContents(new ByteArrayInputStream(byteArray), true, false, monitor);
                } else {
                    file.create(new ByteArrayInputStream(byteArray), true, monitor);
                }

                mNinePatchedImage.clearDirtyFlag();

                AdtPlugin.getDisplay().asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        setPartName(mFileName);
                        firePropertyChange(PROP_DIRTY);
                    }
                });
            } catch (CoreException e) {
                AdtPlugin.log(e, null);
            }
        }
    }

    @Override
    public void createPartControl(Composite parent) {
        mMainFrame = new MainFrame(parent, SWT.NULL);

        ImageViewer imageViewer = mMainFrame.getImageEditorPanel().getImageViewer();
        imageViewer.addUpdateListener(this);

        mNinePatchedImage = imageViewer.loadFile(mFileEditorInput.getPath().toOSString());
        if (mNinePatchedImage.hasNinePatchExtension()) {
            if (!mNinePatchedImage.ensure9Patch() && showConvertMessageBox(mFileName)) {
                // Reload image
                mNinePatchedImage = imageViewer.loadFile(mFileEditorInput.getPath().toOSString());
                mNinePatchedImage.convertToNinePatch();
            }
        } else {
            mNinePatchedImage.convertToNinePatch();
        }

        imageViewer.startDisplay();

        parent.layout();
    }

    @Override
    public void setFocus() {
        mMainFrame.forceFocus();
    }

    @Override
    public boolean isDirty() {
        return mNinePatchedImage.isDirty();
    }

    @Override
    public void update(NinePatchedImage image) {
        if (image.isDirty()) {
            firePropertyChange(PROP_DIRTY);
        }
    }

    private IPath showSaveAsDialog() {
        SaveAsDialog dialog = new SaveAsDialog(AdtPlugin.getDisplay().getActiveShell());

        IFile dest = mProject.getFile(NinePatchedImage.getNinePatchedFileName(
                mFileEditorInput.getFile().getProjectRelativePath().toOSString()));
        dialog.setOriginalFile(dest);

        dialog.create();

        if (dialog.open() == Window.CANCEL) {
            return null;
        }

        return dialog.getResult();
    }

    private static boolean showConvertMessageBox(String fileName) {
        return MessageDialog.openQuestion(
                AdtPlugin.getDisplay().getActiveShell(),
                "Warning",
                String.format("The file \"%s\" doesn't seem to be a 9-patch file. \n"
                        + "Do you want to convert?", fileName));
    }
}
