/**
 * 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.hcatalog.api;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hive.metastore.MetaStoreUtils;
import org.apache.hadoop.hive.metastore.Warehouse;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
import org.apache.hadoop.hive.metastore.api.MetaException;
import org.apache.hadoop.hive.metastore.api.Partition;
import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
import org.apache.hadoop.hive.metastore.api.Table;
import org.apache.hcatalog.common.HCatException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * The Class HCatAddPartitionDesc helps users in defining partition attributes.
 */
public class HCatAddPartitionDesc {

    private static final Logger LOG = LoggerFactory.getLogger(HCatAddPartitionDesc.class);
    private String tableName;
    private String dbName;
    private String location;
    private Map<String, String> partSpec;

    private HCatAddPartitionDesc(String dbName, String tbl, String loc, Map<String, String> spec) {
        this.dbName = dbName;
        this.tableName = tbl;
        this.location = loc;
        this.partSpec = spec;
    }

    /**
     * Gets the location.
     *
     * @return the location
     */
    public String getLocation() {
        return this.location;
    }


    /**
     * Gets the partition spec.
     *
     * @return the partition spec
     */
    public Map<String, String> getPartitionSpec() {
        return this.partSpec;
    }

    /**
     * Gets the table name.
     *
     * @return the table name
     */
    public String getTableName() {
        return this.tableName;
    }

    /**
     * Gets the database name.
     *
     * @return the database name
     */
    public String getDatabaseName() {
        return this.dbName;
    }

    @Override
    public String toString() {
        return "HCatAddPartitionDesc ["
            + (tableName != null ? "tableName=" + tableName + ", " : "tableName=null")
            + (dbName != null ? "dbName=" + dbName + ", " : "dbName=null")
            + (location != null ? "location=" + location + ", " : "location=null")
            + (partSpec != null ? "partSpec=" + partSpec : "partSpec=null") + "]";
    }

    /**
     * Creates the builder for specifying attributes.
     *
     * @param dbName the db name
     * @param tableName the table name
     * @param location the location
     * @param partSpec the part spec
     * @return the builder
     * @throws HCatException
     */
    public static Builder create(String dbName, String tableName, String location,
                                 Map<String, String> partSpec) throws HCatException {
        return new Builder(dbName, tableName, location, partSpec);
    }

    Partition toHivePartition(Table hiveTable) throws HCatException {
        Partition hivePtn = new Partition();
        hivePtn.setDbName(this.dbName);
        hivePtn.setTableName(this.tableName);

        List<String> pvals = new ArrayList<String>();
        for (FieldSchema field : hiveTable.getPartitionKeys()) {
            String val = partSpec.get(field.getName());
            if (val == null || val.length() == 0) {
                throw new HCatException("create partition: Value for key "
                    + field.getName() + " is null or empty");
            }
            pvals.add(val);
        }

        hivePtn.setValues(pvals);
        StorageDescriptor sd = new StorageDescriptor(hiveTable.getSd());
        hivePtn.setSd(sd);
        hivePtn.setParameters(hiveTable.getParameters());
        if (this.location != null) {
            hivePtn.getSd().setLocation(this.location);
        } else {
            String partName;
            try {
                partName = Warehouse.makePartName(
                    hiveTable.getPartitionKeys(), pvals);
                LOG.info("Setting partition location to :" + partName);
            } catch (MetaException e) {
                throw new HCatException("Exception while creating partition name.", e);
            }
            Path partPath = new Path(hiveTable.getSd().getLocation(), partName);
            hivePtn.getSd().setLocation(partPath.toString());
        }
        hivePtn.setCreateTime((int) (System.currentTimeMillis() / 1000));
        hivePtn.setLastAccessTimeIsSet(false);
        return hivePtn;
    }

    public static class Builder {

        private String tableName;
        private String location;
        private Map<String, String> values;
        private String dbName;

        private Builder(String dbName, String tableName, String location, Map<String, String> values) {
            this.dbName = dbName;
            this.tableName = tableName;
            this.location = location;
            this.values = values;
        }

        /**
         * Builds the HCatAddPartitionDesc.
         *
         * @return the h cat add partition desc
         * @throws HCatException
         */
        public HCatAddPartitionDesc build() throws HCatException {
            if (this.dbName == null) {
                this.dbName = MetaStoreUtils.DEFAULT_DATABASE_NAME;
            }
            HCatAddPartitionDesc desc = new HCatAddPartitionDesc(
                this.dbName, this.tableName, this.location,
                this.values);
            return desc;
        }
    }

}
