/*
 * Copyright (c) 2012 Google Inc.
 *
 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 which accompanies this distribution, and is available at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 */
package com.google.eclipse.protobuf.cdt.actions;

import static org.eclipse.xtext.util.Strings.isEmpty;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.ui.IEditorPart;

import com.google.inject.Singleton;

/**
 * @author alruiz@google.com (Alex Ruiz)
 */
@SuppressWarnings("restriction")
@Singleton class ProtoFilePathFinder {
  private static final Pattern PROTO_PATH_PATTERN = Pattern.compile("// source: (.*)");

  IPath findProtoFilePathIn(IEditorPart editor) {
    CEditor cEditor = (CEditor) editor;
    String contents = contentsOf(cEditor);
    if (isEmpty(contents)) {
      return null;
    }
    String line = null;
    int lineCounter = 0;
    BufferedReader reader = new BufferedReader(new StringReader(contents));
    try {
      while ((line = reader.readLine()) != null) {
        switch (lineCounter) {
          case 0:
            if (!"// Generated by the protocol buffer compiler.  DO NOT EDIT!".equals(line)) {
              return null;
            }
            lineCounter++;
            break;
          case 1:
            return pathFrom(line);
        }
      }
    } catch (IOException e) {}
    return null;
  }

  private String contentsOf(CEditor cEditor) {
    ICElement input = cEditor.getInputCElement();
    if (input instanceof ITranslationUnit) {
      ITranslationUnit translationUnit = (ITranslationUnit) input;
      return new String(translationUnit.getContents());
    }
    return null;
  }

  private IPath pathFrom(String line) {
    Matcher matcher = PROTO_PATH_PATTERN.matcher(line);
    if (!matcher.matches()) {
      return null;
    }
    String path = matcher.group(1);
    return (!isEmpty(path)) ? Path.fromOSString(path) : null;
  }
}
