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

# Copyright 2010-2015 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
from os import path

from calculate.lib.cl_lang import setLocalTranslate

setLocalTranslate('cl_install3', sys.modules[__name__])


class FileSystemManager(object):
    """Convert dict install option"""

    defaultOpt = ['noatime']
    defaultBindOpts = ['bind']
    supportFS = {
        'ext2': {'defaultopt': defaultOpt,
                 'format': '/sbin/mkfs.ext2',
                 'formatparam': '{labelparam} {device}',
                 'gpt': '8300',
                 'label': '-L {labelname}',
                 'ssd': [],
                 'msdos': '83',
                 'type': ['hdd', 'usb-hdd']},
        'ext3': {'defaultopt': defaultOpt,
                 'format': '/sbin/mkfs.ext3',
                 'formatparam': '{labelparam} {device}',
                 'gpt': '8300',
                 'label': '-L {labelname}',
                 'ssd': [],
                 'msdos': '83',
                 'type': ['hdd', 'usb-hdd']},
        'ext4': {'defaultopt': defaultOpt,
                 'format': '/sbin/mkfs.ext4',
                 'formatparam': '{labelparam} {device}',
                 'gpt': '8300',
                 'label': '-L {labelname}',
                 'ssd': ['discard'],
                 'msdos': '83',
                 'type': ['hdd', 'usb-hdd']},
        'reiserfs': {'defaultopt': defaultOpt,
                     'format': '/sbin/mkfs.reiserfs',
                     'formatparam': '{labelparam} -f {device}',
                     'gpt': '8300',
                     'label': '-l {labelname}',
                     'msdos': '83',
                     'ssd': [],
                     'type': ['hdd', 'usb-hdd']},
        'btrfs': {'defaultopt': defaultOpt,
                  'format': '/sbin/mkfs.btrfs',
                  'formatparam': '{labelparam} -f {device}',
                  'gpt': '8300',
                  'label': '-L {labelname}',
                  'msdos': '83',
                  'ssd': ['ssd', 'discard', 'space_cache'],
                  'type': ['hdd', 'usb-hdd']},
        'jfs': {'defaultopt': defaultOpt,
                'format': '/sbin/mkfs.jfs',
                'formatparam': '{labelparam} -f {device}',
                'gpt': '8300',
                'label': '-L {labelname}',
                'msdos': '83',
                'ssd': ['discard'],
                'type': ['hdd', 'usb-hdd']},
        'xfs': {'defaultopt': defaultOpt,
                'format': '/sbin/mkfs.xfs',
                'formatparam': '{labelparam} -f {device}',
                'gpt': '8300',
                'label': '-L {labelname}',
                'msdos': '83',
                'ssd': ['discard'],
                'type': ['hdd', 'usb-hdd']},
        'nilfs2': {'defaultopt': defaultOpt,
                   'format': '/sbin/mkfs.nilfs2',
                   'formatparam': '{labelparam} {device}',
                   'gpt': '8300',
                   'label': '-L {labelname}',
                   'msdos': '83',
                   'ssd': [],
                   'type': ['hdd', 'usb-hdd']},
        'swap': {'defaultopt': ['sw'],
                 'format': '/sbin/mkswap',
                 'formatparam': '{device}',
                 'gpt': '8200',
                 'label': '',
                 'ssd': [],
                 'msdos': '82'},
        'uefi': {'defaultopt': defaultOpt,
                 'format': '/usr/sbin/mkfs.vfat',
                 'formatparam': '{labelparam} -F 32 {device}',
                 'gpt': 'EF00',
                 'label': '-n {labelname}',
                 'msdos': '0b',
                 'ssd': [],
                 'type': ['hdd']},
        'vfat': {'defaultopt': defaultOpt,
                 'format': '/usr/sbin/mkfs.vfat',
                 'formatparam': '{labelparam} -F 32 {device}',
                 'gpt': '0700',
                 'label': '-n {labelname}',
                 'msdos': '0b',
                 'ssd': ['discard'],
                 'type': ['flash']},
        'ntfs': {'defaultopt': defaultOpt,
                 'format': '/usr/sbin/mkfs.ntfs',
                 'formatparam': '{labelparam} -FQ {device}',
                 'gpt': '8300',
                 'label': '-L {labelname}',
                 'msdos': '7',
                 'ssd': [],
                 'compatible': ['ntfs-3g']},
        'ntfs-3g': {'defaultopt': defaultOpt,
                    'format': '/usr/sbin/mkfs.ntfs',
                    'formatparam': '{labelparam} -FQ {device}',
                    'gpt': '8300',
                    'label': '-L {labelname}',
                    'ssd': [],
                    'msdos': '7',
                    'compatible': ['ntfs']}}

    default_param = {'defaultopt': defaultOpt,
                     'ssd': []}

    @classmethod
    def firstAvailable(cls, listFS):
        for fs in listFS:
            if path.exists(cls.supportFS['format']):
                return fs
        else:
            return ""

    defaultFS = {
        'hdd': ("ext4"
                if path.exists(supportFS['ext4']['format']) else
                "reiserfs"
                if path.exists(supportFS['reiserfs']['format']) else
                "ext3"),
        'flash': "vfat",
        'usb-hdd': ("ext4"
                    if path.exists(supportFS['ext4']['format']) else
                    "reiserfs"
                    if path.exists(supportFS['reiserfs']['format']) else
                    "ext3")
    }

    @classmethod
    def getDefaultOpt(cls, fs, ssd=False):
        return ",".join(cls.supportFS.get(fs, cls.default_param)['defaultopt'] +
                        (cls.supportFS.get(fs, cls.default_param)['ssd']
                         if ssd else []))

    @classmethod
    def checkFSForTypeMount(cls, fs, roottype, mp):
        if mp == '/boot/efi':
            if fs not in ('uefi', 'vfat'):
                return False
            else:
                return True
        return roottype in cls.supportFS.get(fs, {}).get('type', [])
