/**
 * TEMPLATE: ged-anexos-processo.js
 * =============================================
 * Buscar, listar e manipular anexos de processos.
 * Funcoes utilitarias para eventos de processo.
 *
 * PADRAO DE PRODUCAO (QUA_GER_002, publicaDoc):
 * - Dataset "processAttachment" para listar anexos
 * - Document WebService para obter conteudo
 * - Copiar anexo para pasta GED
 * - Validar se processo tem anexos
 *
 * DATASETS INTERNOS UTEIS:
 * - processAttachment: lista anexos do processo
 * - document: metadados de documentos GED
 */

// =============================================
// LISTAR ANEXOS DO PROCESSO
// =============================================
function fnListarAnexos() {
    var nrProcesso = getValue("WKNumProces");
    var empresa = getValue("WKCompany");

    var c1 = DatasetFactory.createConstraint(
        "processAttachmentPK.processInstanceId",
        nrProcesso, nrProcesso, ConstraintType.MUST);
    var c2 = DatasetFactory.createConstraint(
        "processAttachmentPK.companyId",
        empresa, empresa, ConstraintType.MUST);

    var campos = new Array(
        "documentId",
        "processAttachmentPK.attachmentSequence",
        "version");
    var ordenacao = new Array("processAttachmentPK.attachmentSequence");

    var dsAnexos = DatasetFactory.getDataset(
        "processAttachment", campos, new Array(c1, c2), ordenacao);

    log.info("=== fnListarAnexos: " + dsAnexos.rowsCount + " anexo(s) encontrado(s)");
    return dsAnexos;
}

// =============================================
// VALIDAR SE PROCESSO TEM ANEXOS
// =============================================
function fnTemAnexo() {
    var dsAnexos = fnListarAnexos();
    return dsAnexos.rowsCount > 0;
}

// =============================================
// CONTAR ANEXOS (excluindo fichario principal)
// =============================================
function fnContarAnexos() {
    var dsAnexos = fnListarAnexos();
    var count = 0;
    var fichario = "";

    for (var i = 0; i < dsAnexos.rowsCount; i++) {
        if (dsAnexos.getValue(i, "processAttachmentPK.attachmentSequence") == 1) {
            // Primeiro registro = fichario do formulario (nao e anexo do usuario)
            fichario = dsAnexos.getValue(i, "documentId");
        } else if (dsAnexos.getValue(i, "documentId") != fichario) {
            count++;
        }
    }

    log.info("=== fnContarAnexos: " + count + " anexo(s) reais");
    return count;
}

// =============================================
// OBTER METADADOS DE UM ANEXO
// =============================================
function fnObterMetadadosAnexo(documentId) {
    var c1 = DatasetFactory.createConstraint(
        "documentPK.documentId", documentId, documentId, ConstraintType.MUST);
    var c2 = DatasetFactory.createConstraint(
        "activeVersion", "true", "true", ConstraintType.MUST);

    var dsDoc = DatasetFactory.getDataset(
        "document",
        new Array("documentDescription", "phisicalFile", "documentPK.version"),
        new Array(c1, c2),
        null);

    if (dsDoc.rowsCount > 0) {
        return {
            descricao: dsDoc.getValue(0, "documentDescription"),
            arquivo: dsDoc.getValue(0, "phisicalFile"),
            versao: dsDoc.getValue(0, "documentPK.version")
        };
    }
    return null;
}

// =============================================
// COPIAR ANEXO DO PROCESSO PARA PASTA GED
// =============================================
function fnCopiarAnexoParaPasta(documentId, versao, idPastaDestino) {

    var usuario = getValue("WKUser");
    var senha = "MD5:" + getValue("WKUserPassword");
    var empresa = getValue("WKCompany");

    try {
        // Obter servico
        var provider = ServiceManager.getServiceInstance("Document");
        var locator = provider.instantiate(
            "com.datasul.technology.webdesk.dm.ws.DocumentServiceService");
        var service = locator.getDocumentServicePort();

        // Buscar documento original
        var document = service.getDocumentVersion(
            usuario, senha, empresa, documentId, versao, usuario);
        var doc = document.getItem().get(0);
        var nomeArquivo = doc.getPhisicalFile();

        // Obter conteudo binario
        var conteudo = service.getDocumentContent(
            usuario, senha, empresa,
            documentId, usuario, versao, nomeArquivo);

        // Configurar novo documento
        doc.setParentDocumentId(new java.lang.Integer(idPastaDestino));
        doc.setDocumentId(0);                    // 0 = novo documento
        doc.setInheritSecurity(true);
        doc.setActiveVersion(true);
        doc.setApproved(true);
        doc.setVolumeId("Default");
        doc.setColleagueId(usuario);
        doc.setPublisherId(usuario);

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

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

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

        // Criar na pasta destino
        var docSec = provider.instantiate(
            "com.datasul.technology.webdesk.dm.ws.DocumentSecurityConfigDtoArray");
        var aprovDoc = provider.instantiate(
            "com.datasul.technology.webdesk.dm.ws.ApproverDtoArray");
        var relatedArr = provider.instantiate(
            "com.datasul.technology.webdesk.dm.ws.RelatedDocumentDtoArray");

        var resultado = 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: " + wsm.getWebServiceMessage();
        }

        var novoId = wsm.getDocumentId();
        log.info("=== fnCopiarAnexo: documento " + documentId + " copiado como " + novoId);
        return novoId;

    } catch (e) {
        log.error("=== fnCopiarAnexo ERRO: " + e.message);
        throw e;
    }
}

// =============================================
// USO EM EVENTO DE PROCESSO (exemplo)
// =============================================
// function afterProcessFinish(colleagueId) {
//     // Copiar todos os anexos para pasta de arquivo morto
//     var dsAnexos = fnListarAnexos();
//     var idPastaArquivo = 12345;  // ID da pasta destino
//     var fichario = "";
//
//     for (var i = 0; i < dsAnexos.rowsCount; i++) {
//         if (i == 0) {
//             fichario = dsAnexos.getValue(i, "documentId");
//             continue; // Pular fichario
//         }
//         var docId = dsAnexos.getValue(i, "documentId");
//         if (docId != fichario) {
//             fnCopiarAnexoParaPasta(
//                 docId,
//                 dsAnexos.getValue(i, "version"),
//                 idPastaArquivo);
//         }
//     }
// }
