/*
 * Copyright 2010 ETH Zuerich, CISD
 *
 * 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 eu.basysbio.cisd.dss;

import java.io.File;
import java.io.FileReader;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;

import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
import ch.systemsx.cisd.common.exceptions.UserFailureException;
import ch.systemsx.cisd.common.filesystem.FileUtilities;
import ch.systemsx.cisd.etlserver.cifex.CifexExtractorHelper;
import ch.systemsx.cisd.etlserver.utils.Column;
import ch.systemsx.cisd.etlserver.utils.TabSeparatedValueTable;
import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;

/**
 * 
 *
 * @author Franz-Josef Elmer
 */
class LcaMicDataSetUploader extends AbstractDataSetUploader
{
    static final IDataSetUploaderFactory FACTORY = new IDataSetUploaderFactory()
    {
        
        public IDataSetUploader create(DataSetInformation dataSetInformation,
                DataSource dataSource, IEncapsulatedOpenBISService service,
                TimeSeriesDataSetUploaderParameters parameters)
        {
            return new LcaMicDataSetUploader(dataSource, service, parameters);
        }

        public IDataSetUploader create(DataSetInformation dataSetInformation,
                ITimeSeriesDAO dao, IEncapsulatedOpenBISService service,
                TimeSeriesDataSetUploaderParameters parameters)
        {
            return new LcaMicDataSetUploader(dao, service, parameters);
        }
    };

    LcaMicDataSetUploader(DataSource dataSource, IEncapsulatedOpenBISService service,
            TimeSeriesDataSetUploaderParameters parameters)
    {
        super(dataSource, service, parameters);
    }

    LcaMicDataSetUploader(ITimeSeriesDAO dao, IEncapsulatedOpenBISService service,
            TimeSeriesDataSetUploaderParameters parameters)
    {
        super(dao, service, parameters);
    }

    @Override
    protected void handleTSVFile(File tsvFile, DataSetInformation dataSetInformation,
            IDropBoxFeeder feeder)
    {
        FileReader reader = null;
        try
        {
            reader = new FileReader(tsvFile);
            String fileName = tsvFile.toString();
            TabSeparatedValueTable table =
                    new TabSeparatedValueTable(reader, fileName, parameters.isIgnoreEmptyLines(), true);
            List<Column> columns = table.getColumns();
            File timeSeriesDropBox = parameters.getTimeSeriesDropBox();
            List<String> timeValues = columns.get(0).getValues();
            List<NewProperty> properties = dataSetInformation.getDataSetProperties();
            for (NewProperty property : properties)
            {
                if (property.getPropertyCode().equals(TimeSeriesPropertyType.TIME_POINT_LIST.toString()))
                {
                    property.setValue(HeaderUtils.join(timeValues));
                }
            }
            for (int i = 1; i < columns.size(); i++)
            {
                Column column = columns.get(i);
                String header = column.getHeader();
                File dataSet = new File(timeSeriesDropBox, DataSetHandler.LCA_MIC_TIME_SERIES + i);
                dataSet.mkdir();
                String[] items = header.split(DataColumnHeader.SEPARATOR);
                if (items.length < 11)
                {
                    throw new UserFailureException("Invalid header: Missing BBA ID: " + header);
                }
                String bbaID = items[10];
                if (bbaID.startsWith("BBA") == false)
                {
                    throw new UserFailureException("Invalid header: BBA ID doesn't start with 'BBA': " + header);
                }
                items[10] = "NB";
                StringBuilder builder = new StringBuilder("BBA ID");
                for (String value : timeValues)
                {
                    items[3] = value;
                    builder.append("\t").append(StringUtils.join(items, DataColumnHeader.SEPARATOR));
                }
                builder.append("\n").append(bbaID);
                List<String> values = column.getValues();
                for (String value : values)
                {
                    builder.append("\t").append(value);
                }
                builder.append("\n");
                FileUtilities.writeToFile(new File(dataSet, header + ".txt"), builder.toString());
                builder.setLength(0);
                builder.append("comment=null,");
                builder.append(dataSetInformation.getExperimentIdentifier()).append(",");
                builder.append(dataSetInformation.getDataSetCode()).append(",");
                builder.append(DataSetHandler.LCA_MIC_TIME_SERIES).append(",TSV\n");
                builder.append("user-email=").append(dataSetInformation.tryGetUploadingUserEmail());
                FileUtilities.writeToFile(new File(dataSet, CifexExtractorHelper.REQUEST_PROPERTIES_FILE), builder.toString());
            }
        } catch (RuntimeException ex)
        {
            throw ex;
        } catch (Exception ex)
        {
            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
        } finally
        {
            IOUtils.closeQuietly(reader);
        }
    }
    
}