/**
 * TEMPLATE: ged-document-service.js
 * =============================================
 * Operacoes com documentos GED via Document WebService.
 * Criar, atualizar, mover documentos e pastas.
 *
 * PADRAO DE PRODUCAO (QUA_GER_002 publicaDoc, Vipal GED):
 * - ServiceManager.getServiceInstance("Document")
 * - Instantiate DocumentServiceService
 * - getDocumentVersion, createDocument, updateDocument
 * - Attachment com conteudo binario
 * - Documentos relacionados
 *
 * PRE-REQUISITO:
 * Servico "Document" cadastrado no Painel do Fluig.
 * Ou usar nome completo da classe WSDL.
 */

// =============================================
// INICIALIZAR SERVICO DE DOCUMENTOS
// =============================================
function fnGetDocumentService() {
    var provider = ServiceManager.getServiceInstance("Document");
    var locator = provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.DocumentServiceService");
    var service = locator.getDocumentServicePort();
    return { provider: provider, service: service };
}

// =============================================
// CREDENCIAIS (usar dataset de config em producao)
// =============================================
var usuario = getValue("WKUser");
var senha = "MD5:" + getValue("WKUserPassword");
// Alternativa com usuario fixo:
// var usuario = "${USUARIO_GED}";
// var senha = "${SENHA_GED}";
var empresa = getValue("WKCompany");

// =============================================
// BUSCAR DOCUMENTO POR ID E VERSAO
// =============================================
function fnBuscarDocumento(documentId, versao) {
    var ds = fnGetDocumentService();

    var document = ds.service.getDocumentVersion(
        usuario, senha, empresa,
        documentId,
        versao,         // 1000 = versao inicial
        getValue("WKUser"));

    if (document.getItem() != null && document.getItem().size() > 0) {
        return document.getItem().get(0);
    }
    return null;
}

// =============================================
// OBTER CONTEUDO (bytes) DO DOCUMENTO
// =============================================
function fnObterConteudo(documentId, versao, nomeArquivo) {
    var ds = fnGetDocumentService();

    var conteudo = ds.service.getDocumentContent(
        usuario, senha, empresa,
        documentId,
        getValue("WKUser"),
        versao,
        nomeArquivo);

    return conteudo;
}

// =============================================
// CRIAR DOCUMENTO NO GED
// =============================================
function fnCriarDocumento(idPasta, descricao, conteudoBytes, nomeArquivo) {
    var ds = fnGetDocumentService();

    // Montar DTO do documento
    var docArray = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.DocumentDtoArray");
    var doc = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.DocumentDto");

    doc.setDocumentDescription(descricao);
    doc.setParentDocumentId(new java.lang.Integer(idPasta));
    doc.setColleagueId(getValue("WKUser"));
    doc.setPublisherId(getValue("WKUser"));
    doc.setCompanyId(empresa);
    doc.setDocumentType("2");                // 2 = documento
    doc.setTopicId(new java.lang.Integer(3)); // 3 = geral (ajustar)
    doc.setInheritSecurity(true);
    doc.setActiveVersion(true);
    doc.setApproved(true);
    doc.setDownloadEnabled(true);
    doc.setVolumeId("Default");
    doc.setDocumentId(0);                    // 0 = novo
    doc.setVersionOption("0");               // 0=manter, 1=revisao, 2=versao

    docArray.getItem().add(doc);

    // Montar anexo
    var attach = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.Attachment");
    attach.setFileName(nomeArquivo);
    attach.setFilecontent(conteudoBytes);
    attach.setPrincipal(true);
    attach.setEditing(false);

    var attachArray = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.AttachmentArray");
    attachArray.getItem().add(attach);

    // Arrays vazios obrigatorios
    var docSec = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.DocumentSecurityConfigDtoArray");
    var aprovDoc = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.ApproverDtoArray");
    var relatedArr = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.RelatedDocumentDtoArray");

    // Criar
    var resultado = ds.service.createDocument(
        usuario, senha, empresa,
        docArray, attachArray, docSec, aprovDoc, relatedArr);

    var wsm = resultado.getItem().get(0);
    if (wsm.getWebServiceMessage() != null && wsm.getWebServiceMessage() != "ok") {
        throw "ERRO ao criar documento: " + wsm.getWebServiceMessage();
    }

    var novoDocId = wsm.getDocumentId();
    log.info("=== Documento criado: " + novoDocId);
    return novoDocId;
}

// =============================================
// ATUALIZAR DOCUMENTO EXISTENTE
// =============================================
function fnAtualizarDocumento(documentId, versao, novaDescricao, conteudoBytes, nomeArquivo) {
    var ds = fnGetDocumentService();

    // Buscar documento existente
    var document = ds.service.getDocumentVersion(
        usuario, senha, empresa, documentId, versao, getValue("WKUser"));
    var doc = document.getItem().get(0);

    // Alterar campos
    doc.setDocumentDescription(novaDescricao);
    doc.setPublisherId(getValue("WKUser"));
    doc.setVersionOption("1");  // 1 = cria revisao
    doc.setVersionDescription("Atualizado via processo " + getValue("WKNumProces"));
    doc.setInheritSecurity(true);
    doc.setUpdateIsoProperties(true);

    document.getItem().add(doc);

    // Montar novo anexo (se houver)
    var attachArray = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.AttachmentArray");

    if (conteudoBytes != null) {
        var attach = ds.provider.instantiate(
            "com.datasul.technology.webdesk.dm.ws.Attachment");
        attach.setFileName(nomeArquivo);
        attach.setFilecontent(conteudoBytes);
        attach.setPrincipal(true);
        attach.setEditing(false);
        attachArray.getItem().add(attach);
    }

    var docSec = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.DocumentSecurityConfigDtoArray");
    var aprovDoc = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.ApproverDtoArray");
    var relatedArr = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.RelatedDocumentDtoArray");

    var resultado = ds.service.updateDocument(
        usuario, senha, empresa,
        document, attachArray, docSec, aprovDoc, relatedArr);

    var wsm = resultado.getItem().get(0);
    if (wsm.getWebServiceMessage() != null && wsm.getWebServiceMessage() != "ok") {
        throw "ERRO ao atualizar documento: " + wsm.getWebServiceMessage();
    }

    log.info("=== Documento atualizado: " + documentId);
}

// =============================================
// CRIAR PASTA NO GED
// =============================================
function fnCriarPasta(idPastaPai, nomePasta) {
    var ds = fnGetDocumentService();

    var docArray = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.DocumentDtoArray");
    var doc = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.DocumentDto");

    doc.setDocumentDescription(nomePasta);
    doc.setDocumentType("1");                    // 1 = pasta
    doc.setParentDocumentId(new java.lang.Integer(idPastaPai));
    doc.setInheritSecurity(true);
    doc.setVolumeId("Default");
    doc.setCompanyId(empresa);
    doc.setColleagueId(getValue("WKUser"));

    docArray.getItem().add(doc);

    var attachArray = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.AttachmentArray");
    var docSec = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.DocumentSecurityConfigDtoArray");
    var aprovDoc = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.ApproverDtoArray");
    var relatedArr = ds.provider.instantiate(
        "com.datasul.technology.webdesk.dm.ws.RelatedDocumentDtoArray");

    var resultado = ds.service.createDocument(
        usuario, senha, empresa,
        docArray, attachArray, docSec, aprovDoc, relatedArr);

    var idNovaPasta = resultado.getItem().get(0).getDocumentId();
    log.info("=== Pasta criada: " + nomePasta + " (ID: " + idNovaPasta + ")");
    return idNovaPasta;
}

// =============================================
// MOVER DOCUMENTO PARA OUTRA PASTA
// =============================================
function fnMoverDocumento(documentId, idPastaDestino) {
    var ds = fnGetDocumentService();

    var listaDocs = ds.provider.instantiate("net.java.dev.jaxb.array.IntArray");
    listaDocs.getItem().add(new java.lang.Integer(documentId));

    ds.service.moveDocument(
        usuario, senha, empresa,
        listaDocs,
        getValue("WKUser"),
        idPastaDestino);

    log.info("=== Documento " + documentId + " movido para pasta " + idPastaDestino);
}
