/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.manifoldcf.crawler.connectors.alfrescowebscript.tests;


import org.apache.chemistry.opencmis.client.api.*;
import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.SessionParameter;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.enums.BindingType;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CMISUtils {

  private String serviceUrl = "http://localhost:8080/alfresco/api/-default-/public/cmis/versions/1.1/atom";
  private String user;
  private String password;
  private String folderName = "";

  private Session session = null;
  public Session getSession() {
    if (session == null) {
      SessionFactory factory = SessionFactoryImpl.newInstance();
      Map<String, String> parameter = new HashMap<String, String>();
      parameter.put(SessionParameter.USER, getUser());
      parameter.put(SessionParameter.PASSWORD, getPassword());
      parameter.put(SessionParameter.ATOMPUB_URL, getServiceUrl());
      parameter.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
      List<Repository> repositories = factory.getRepositories(parameter);
      this.session = repositories.get(0).createSession();
    }
    return this.session;
  }

  public Document createDocument(String docName, String contentType) {
    Session session = getSession();
    Folder folder = (Folder) session.getObjectByPath("/" + getFolderName());
    String timeStamp = Long.valueOf(System.currentTimeMillis()).toString();
    String filename = docName + " (" + timeStamp + ")";
    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put(PropertyIds.OBJECT_TYPE_ID, contentType);
    properties.put(PropertyIds.NAME, filename);
    properties.put(PropertyIds.IS_MAJOR_VERSION, true);
    properties.put(PropertyIds.IS_LATEST_MAJOR_VERSION, true);

    String docText = "Lorem ipsum";
    byte[] content = docText.getBytes(StandardCharsets.UTF_8);
    InputStream stream = new ByteArrayInputStream(content);
    ContentStream contentStream = session.getObjectFactory().createContentStream(
        filename,
        Long.valueOf(content.length),
        "text/plain",
        stream);
    Document doc = folder.createDocument(
        properties,
        contentStream,
        VersioningState.MAJOR);

    return doc;
  }

  public String getServiceUrl() {
    return serviceUrl;
  }

  public void setServiceUrl(String serviceUrl) {
    this.serviceUrl = serviceUrl;
  }

  public String getPassword() {
    return password;
  }

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

  public String getUser() {
    return user;
  }

  public void setUser(String user) {
    this.user = user;
  }

  public String getFolderName() {
    return folderName;
  }

  public void setFolderName(String folderName) {
    this.folderName = folderName;
  }
}
