/**
 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.flex.utilities.developerToolSuite.executor.infrastructure.command {
    import flash.data.SQLResult;

    import mx.resources.ResourceManager;
    import mx.utils.ObjectUtil;

    import org.apache.flex.utilities.developerToolSuite.LocaleUtil;
    import org.apache.flex.utilities.developerToolSuite.executor.domain.SettingModel;
    import org.apache.flex.utilities.developerToolSuite.executor.infrastructure.message.ApplicationReadyMessage;
    import org.apache.flex.utilities.developerToolSuite.executor.infrastructure.message.InitApplicationMessage;

    public class GetSettingsFromDBCommand extends AbstractDBCommand {

        [Inject]
        public var settings:SettingModel;

        public function execute(msg:InitApplicationMessage):void {
            executeAsync();
        }

        override protected function prepareSql():void {
            sql = "SELECT name, value FROM setting;";
            super.prepareSql();
        }

        override protected function result(result:SQLResult, terminateCommand:Boolean = true):void {
            var row:Object;

            if (result.data) {
                var numResults:int = result.data.length;
                for (var i:int = 0; i < numResults; i++) {
                    row = result.data[i];
                    settings[row.name] = row.value;
                }
            }

            if (settings.locale == null) {
                settings.locale = LocaleUtil.getDefaultLanguage().data;
            }
            ResourceManager.getInstance().localeChain = LocaleUtil.getOrderedLocalChain(settings.locale);
            dispatch(new ApplicationReadyMessage());

            log.debug("Got settings: {0}", ObjectUtil.toString(result.data));

            if (terminateCommand) {
                callback(new CommandCallBackResult(settings));
            }
        }
    }
}
