/*
 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.
 */
//helper for formatting JSON and others

var DOC_PLACEHOLDER = '<doc>\n' +
                '<field name="id">change.me</field>' +
                '<field name="title">change.me</field>' +
                '</doc>';

var ADD_PLACEHOLDER = '<add>\n' + DOC_PLACEHOLDER + '</add>\n';

solrAdminApp.controller('DocumentsController',
    function($scope, $rootScope, $routeParams, $location, Luke, Update, FileUpload, Constants) {
        $scope.resetMenu("documents", Constants.IS_COLLECTION_PAGE);

        $scope.refresh = function () {
            Luke.schema({core: $routeParams.core}, function(data) {
                //TODO: handle dynamic fields
                delete data.schema.fields._version_;
                $scope.fields = Object.keys(data.schema.fields);
            });
            $scope.document = "";
            $scope.handler = "/update";
            $scope.type = "json";
            $scope.commitWithin = 1000;
            $scope.overwrite = true;
            $scope.boost = "1.0";
        };

        $scope.refresh();

        $scope.changeDocumentType = function () {
            $scope.placeholder = "";
            if ($scope.type == 'json') {
                $scope.placeholder = '{"id":"change.me","title":"change.me"}';
            } else if ($scope.type == 'csv') {
                $scope.placeholder = "id,title\nchange.me,change.me";
            } else if ($scope.type == 'solr') {
                $scope.placeholder = ADD_PLACEHOLDER;
            } else if ($scope.type == 'xml') {
                $scope.placeholder = DOC_PLACEHOLDER;
            }
        };

        $scope.addWizardField = function () {
            if ($scope.document == "") $scope.document = "{}";
            var doc = JSON.parse($scope.document);
            doc[$scope.fieldName] = $scope.fieldData;
            $scope.document = JSON.stringify(doc, null, '\t');
            $scope.fieldData = "";
        };

        $scope.submit = function () {
            var contentType = "";
            var postData = "";
            var params = {};
            var doingFileUpload = false;

            if ($scope.handler[0] == '/') {
                params.handler = $scope.handler.substring(1);
            } else {
                params.handler = 'update';
                params.qt = $scope.handler;
            }

            params.commitWithin = $scope.commitWithin;
            params.boost = $scope.boost;
            params.overwrite = $scope.overwrite;
            params.core = $routeParams.core;
            params.wt = "json";

            if ($scope.type == "json" || $scope.type == "wizard") {
                postData = "[" + $scope.document + "]";
                contentType = "json";
            } else if ($scope.type == "csv") {
                postData = $scope.document;
                contentType = "csv";
            } else if ($scope.type == "xml") {
                postData = "<add>" + $scope.document + "</add>";
                contentType = "xml";
            } else if ($scope.type == "upload") {
                doingFileUpload = true;
                params.raw = $scope.literalParams;
            } else if ($scope.type == "solr") {
                postData = $scope.document;
                if (postData[0] == "<") {
                    contentType = "xml";
                } else if (postData[0] == "{" || postData[0] == '[') {
                    contentType = "json";
                } else {
                    alert("Cannot identify content type")
                }
            }
            if (!doingFileUpload) {
                var callback = function (success) {
                  $scope.responseStatus = "success";
                  delete success.$promise;
                  delete success.$resolved;
                  $scope.response = JSON.stringify(success, null, '  ');
                };
                var failure = function (failure) {
                    $scope.responseStatus = failure;
                };
                if (contentType == "json") {
                  Update.postJson(params, postData, callback, failure);
                } else if (contentType == "xml") {
                  Update.postXml(params, postData, callback, failure);
                } else if (contentType == "csv") {
                  Update.postCsv(params, postData, callback, failure);
                }
            } else {
                var file = $scope.fileUpload;
                console.log('file is ' + JSON.stringify(file));
                var uploadUrl = "/fileUpload";
                FileUpload.upload(params, $scope.fileUpload, function (success) {
                    $scope.responseStatus = "success";
                    $scope.response = JSON.stringify(success, null, '  ');
                }, function (failure) {
                    $scope.responseStatus = "failure";
                    $scope.response = JSON.stringify(failure, null, '  ');
                });
            }
        }
    });

