/*
 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.
*/

var contentTypeMap = { xml : 'text/xml', html : 'text/html', js : 'text/javascript', json : 'application/json', 'css' : 'text/css' };
var languages = {js: "javascript", xml:"xml", xsl:"xml", vm: "xml", html: "xml", json: "json", css: "css"};

solrAdminApp.controller('FilesController',
    function($scope, $rootScope, $routeParams, $location, Files, Constants) {
        $scope.resetMenu("files", Constants.IS_COLLECTION_PAGE);

        $scope.file = $location.search().file;
        $scope.content = null;

        $scope.baseurl = $location.protocol()+ "://" + $location.host() + ":" + $location.port();

        $scope.refresh = function () {

            var process = function (path, tree) {
                var params = {core: $routeParams.core};
                if (path.slice(-1) == '/') {
                    params.file = path.slice(0, -1);
                } else if (path!='') {
                    params.file = path;
                }

                Files.list(params, function (data) {
                    var filenames = Object.keys(data.files);
                    filenames.sort();
                    for (var i in filenames) {
                        var file = filenames[i];
                        var filedata = data.files[file];
                        var state = undefined;
                        var children = undefined;

                        if (filedata.directory) {
                            file = file + "/";
                            if ($scope.file && $scope.file.indexOf(path + file) == 0) {
                                state = "open";
                            } else {
                                state = "closed";
                            }
                            children = [];
                            process(path + file, children);
                        }
                        tree.push({
                            data: {
                                title: file,
                                attr: { id: path + file}
                            },
                            children: children,
                            state: state
                        });
                    }
                });
            }
            $scope.tree = [];
            process("", $scope.tree);

            if ($scope.file && $scope.file != '' && $scope.file.split('').pop()!='/') {
                var extension;
                if ($scope.file == "managed-schema") {
                  extension = contentTypeMap['xml'];
                } else {
                  extension = $scope.file.match( /\.(\w+)$/)[1] || '';
                }
                var contentType = (contentTypeMap[extension] || 'text/plain' ) + ';charset=utf-8';

                Files.get({core: $routeParams.core, file: $scope.file, contentType: contentType}, function(data) {
                    $scope.content = data.data;
                    $scope.url = $scope.baseurl + data.config.url + "?" + $.param(data.config.params);
                    if (contentType.indexOf("text/plain") && (data.data.indexOf("<?xml")>=0) || data.data.indexOf("<!--")>=0) {
                        $scope.lang = "xml";
                    } else {
                        $scope.lang = languages[extension] || "txt";
                    }
                });
            }
        };

        $scope.showTreeLink = function(data) {
            var file = data.args[0].id;
            $location.search({file:file});
        };

        $scope.refresh();
    });
