#-*- coding: utf-8 -*-

# Copyright 2010-2013 Calculate Ltd. http://www.calculate-linux.org
#
#  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.

import  sys, time, os

from calculate.lib.datavars import VariableError,DataVarsError,DataVars
from calculate.install.install import InstallError
from calculate.install.distr import DistributiveError

import install
from calculate.lib.cl_lang import setLocalTranslate,getLazyLocalTranslate
setLocalTranslate('cl_install3',sys.modules[__name__])
__ = getLazyLocalTranslate(_)

from calculate.core.server.func import WsdlBase
from calculate.install.utils.cl_install import ClInstallAction
from calculate.install.utils.cl_setup import (ClSetupAudioAction,
                ClSetupLocaleAction,ClSetupVideoAction,ClSetupSystemAction,
                ClSetupBootAction,ClSetupNetworkAction)

class Wsdl(WsdlBase):
    methods = [{
        # идентификатор метода
        'method_name':"install",
        # категория метода
        'category':__("Installation"),
        # заголовок метода 
        'title':__("System Install"),
        # иконка для графической консоли
        'image':'calculate-install,system-installer,applications-other,'\
                'drive-harddisk',
        # метод присутствует в графической консоли
        'gui':True,
        # консольная команда
        'command':'cl-install',
        # права для запуска метода 
        'rights':['install'],
        # объект содержащий модули для действия
        'logic':{'Install':install.Install},
        # описание действия
        'action':ClInstallAction,
        # объект переменных
        'datavars':"install",
        'native_error':(VariableError,DistributiveError,
                        DataVarsError,install.InstallError),
        # значения по умолчанию для переменных этого метода
        'setvars':{'cl_action!':'system','cl_dispatch_conf':'usenew'},
        # описание груп (список лямбда функций)
        'groups': [
            lambda group:group(_("Language and locale"),
                image="welcome",
                normal=('os_install_locale_lang','os_install_clock_timezone')),
            lambda group:group(_("Distribution"),
                normal=('cl_image_filename',),
                hide=('cl_image_linux_shortname','cl_image_arch_machine',
                      'cl_image_new_only'),
                expert=('cl_image_linux_shortname', 'cl_image_arch_machine',
                        'cl_image_new_only')),
            lambda group:group(_("Allocate drive space"),
                normal=('cl_autopartition_set',),
                expert=('cl_autopartition_scheme',
                        'cl_autopartition_table','cl_autopartition_root_size',
                        'cl_autopartition_swap_size',
                        'cl_autopartition_device'),
                expert_label=_("Click to set up autopartition options")),
            lambda group:group(_("Mount points"),
                normal=('os_location_data',),
                hide=('os_location_data','os_install_mbr','os_install_uefi_set'),
                brief_force=('os_location_brief_data','os_install_bootloader',
                             'os_install_uefi_set'),
                expert=('cl_uuid_set',
                        'os_install_root_type',
                        'os_install_mbr',
                        'os_install_uefi_set',
                        'os_install_kernel_scheduler')),
            lambda group:group(_("Network settings"),
                normal=('os_install_net_conf','os_install_net_data',
                        'os_install_net_fqdn','os_install_ntp'),
                expert=('os_install_net_dns','os_install_net_dns_search',
                        'os_install_net_route_data')),
            lambda group:group(_("Users"),
                normal=('cl_migrate_root_pwd','cl_migrate_data','cl_autologin'),
                expert=('cl_install_home_crypt_set',),
                hide=('cl_migrate_data',),
                brief=('cl_migrate_user',)),
            lambda group:group(_("Video"),
                normal=('os_install_x11_video_drv','os_install_x11_composite',
                        'os_install_x11_resolution','os_install_fb_resolution',
                        'os_install_grub_terminal')),
            lambda group: group(_("Update"),
                            normal=('cl_install_autocheck_set',
                                    'cl_install_autocheck_interval'))],
            # действие выводит информацию перед запуском
        'brief':{'next':__("Installation"),
                 'image':'finish',
                 'name':__("Start installing")}},
        # установка на Flash
        {
        'method_name':"install_flash",
        'category':__("Installation"),
        'title':__("Flash Install"),
        'image':'drive-removable-media-usb-pendrive,'\
                'drive-removable-media-usb,media-flash',
        'gui':True,
        'rights':['install'],
        'logic':{'Install':install.Install},
        'action':ClInstallAction,
        'datavars':"install",
        'native_error':(VariableError,DistributiveError,
                        DataVarsError,install.InstallError),
        'setvars':{'cl_action!':'system','cl_install_type':'flash',
                   'cl_protect_use_set!':'off',
                   'cl_dispatch_conf':'usenew'},
        'groups':[
            lambda group:group(_("Flash install"),
                normal=('os_install_disk_single','cl_image_filename'),
                expert=('os_location_data',),
                next_label=_("Install"))]},
        # PXE установка
        {
        'method_name':"install_pxe",
        'category':__("Installation"),
        'title':__("PXE Install"),
        'image':'network-server,preferences-desktop-remote-desktop',
        'command':'cl-install-pxe',
        'gui':True,
        'rights':['installpxe'],
        'logic':{'Install':install.Install},
        'action':ClInstallAction,
        'datavars':"install",
        'native_error':(VariableError,DistributiveError,
                        DataVarsError,install.InstallError),
        'setvars':{'cl_action!':'system','os_install_pxe':'on',
                   'cl_protect_use_set!':'off',
                   'cl_dispatch_conf':'usenew'},
        # действие выводит информацию перед запуском
        'brief':{'next':__("Installation"),
                 'image':'finish',
                 'name':__("Start installing")},
        'groups':[
            lambda group:group(_("PXE install"),
                normal=('cl_image_filename',),
                expert=('os_install_pxe_path',
                        'os_install_pxe_ip'),
                next_label=_("Install"))]},
        # настройка загрузки системы
        {
        'method_name':"setup_boot",
        'category':__("Configuration"),
        'title':__("Boot"),
        'image':'stock_save,drive-harddisk',
        'command':'cl-setup-boot',
        'gui':True,
        'rights':['setupboot'],
        'logic':{'Install':install.Install},
        'action':ClSetupBootAction,
        'datavars':"install",
        'native_error':(VariableError,DataVarsError,install.InstallError),
        'setvars':{'cl_action!':'merge','cl_merge_pkg!':[None],
                   'cl_merge_set!':"on",'cl_setup':'boot'},
        'groups':[
            lambda group:group(_("Boot"),
                normal=('os_install_mbr','os_install_uefi_set',
                        'os_install_kernel_scheduler',
                        'os_install_grub_terminal'),
                expert=('cl_templates_locate','cl_dispatch_conf',
                        'cl_verbose_set'),
                next_label=_("Save"))]},
        {
        # настройка сети
        'method_name':"setup_network",
        'category':__("Configuration"),
        'title':__("Network"),
        'image':'gnome-network-properties,'
                'network-idle,preferences-system-network',
        'command':'cl-setup-network',
        'gui':True,
        'rights':['setupnetwork'],
        'logic':{'Install':install.Install},
        'action':ClSetupNetworkAction,
        'datavars':"install",
        'native_error':(VariableError,DataVarsError,install.InstallError),
        'setvars':{'cl_action!':'merge','cl_merge_pkg!':[None],
                   'cl_merge_set!':"on",'cl_setup':'network'},
        'groups':[
            lambda group:group(_("Boot"),
                normal=('os_install_net_conf','os_install_net_data',
                        'os_install_net_fqdn','os_install_ntp'),
                expert=('os_install_net_dns','os_install_net_dns_search',
                        'os_install_net_route_data',
                        'cl_templates_locate','cl_dispatch_conf',
                        'cl_verbose_set'),
                next_label=_("Save"))]},
        {
        # перенастройка системы
        'method_name':"setup_system",
        'category':__("Configuration"),
        'title':__("System"),
        'image':'system-run,system,computer',
        'command':'cl-setup-system',
        'gui':True,
        'rights':['setupsystem'],
        'logic':{'Install':install.Install},
        'action':ClSetupSystemAction,
        'datavars':"install",
        'native_error':(VariableError,DataVarsError,install.InstallError),
        'setvars':{'cl_action!':'merge','cl_live':'off'},
        'groups':[
            lambda group:group(_("System"),
                normal=('cl_live',),
                expert=('cl_templates_locate','cl_dispatch_conf',
                        'cl_verbose_set'),
                next_label=_("Reconfigure"))]},
        {
        # настройка видео
        'method_name':"setup_video",
        'category':__("Configuration"),
        'title':__("Video"),
        'image':'video-display,gnome-multimedia',
        'command':'cl-setup-video',
        'gui':True,
        'rights':['setupvideo'],
        'logic':{'Install':install.Install},
        'action':ClSetupVideoAction,
        'datavars':"install",
        'native_error':(VariableError,DataVarsError,install.InstallError),
        'setvars':{'cl_action!':'merge','cl_merge_pkg!':[None],
                   'cl_merge_set!':"on",'cl_setup':'video'},
        'groups':[
            lambda group:group(_("Video"),
                normal=('os_install_x11_video_drv',
                        'os_install_x11_resolution',
                        'os_install_x11_composite',
                        'os_install_fb_resolution'),
                expert=('cl_templates_locate','cl_dispatch_conf',
                        'cl_verbose_set'),
                next_label=_("Save"))]},
        {
        # настройка локали
        'method_name':"setup_locale",
        'category':__("Configuration"),
        'title':__("Locale"),
        'image':'locale,preferences-desktop-locale',
        'command':'cl-setup-locale',
        'gui':True,
        'rights':['setuplocale'],
        'logic':{'Install':install.Install},
        'action':ClSetupLocaleAction,
        'datavars':"install",
        'native_error':(VariableError,DataVarsError,install.InstallError),
        'setvars':{'cl_action!':'merge','cl_merge_pkg!':[None],
                   'cl_merge_set!':"on",'cl_setup':'locale'},
        'groups':[
            lambda group:group(_("Locale"),
            normal=('os_install_locale_lang',
                    'os_install_clock_timezone'),
            expert=('cl_templates_locate','cl_dispatch_conf',
                    'cl_verbose_set'),
            next_label=_("Save"))]}]
