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

# Copyright 2012-2016 Mir Calculate. 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 os
from os import path
from calculate.core.datavars import DataVarsCore
from calculate.core.server.gen_pid import search_worked_process
from calculate.lib.cl_template import SystemIni
from calculate.lib.utils.content import getCfgFiles
from calculate.lib.utils.files import getRunCommands, readFile, writeFile


class UpdateInfo(object):
    """
    Информационный объект о процессе обновления
    """
    update_file = "/var/lib/calculate/calculate-update/updates.available"

    def __init__(self, dv=None):
        if dv is None:
            self.dv = DataVarsCore()
            self.dv.importCore()
        else:
            self.dv = dv

    def need_update(self):
        return self.update_ready()

    @classmethod
    def update_ready(cls):
        """
        Проверить есть ли обновления по ini.env
        """
        return path.exists(cls.update_file)

    @classmethod
    def set_update_ready(cls, value):
        """
        Установить статус обновления
        """
        try:
            if value:
                writeFile(cls.update_file).close()
            else:
                os.unlink(cls.update_file)
        except OSError:
            pass

    def check_for_dispatch(self):
        """
        Есть ли в системе не примененные файлы для dispatch-conf
        """
        return bool(getCfgFiles(self.dv.Get('cl_config_protect'),
                                prefix=self.dv.Get('cl_chroot_path')))

    def is_console_gui_run(self):
        """
        Проверить есть ли уже запущенная копия console-gui
        """
        return any(filter(lambda x: "cl-console-gui" in x, getRunCommands()))

    def update_already_run(self):
        """
        В системе уже есть работающий процесс обновления
        """
        return search_worked_process("update", self.dv)

    @property
    def outdated_kernel(self):
        flag_path = self.dv.Get('update.cl_update_outdated_kernel_path')
        if path.exists(flag_path):
            try:
                flag_kernel = readFile(flag_path).strip()
                current_kernel = self.dv.Get('update.cl_update_kernel_version')
                if flag_kernel != current_kernel:
                    return True
            except ValueError:
                pass
        return False

    @outdated_kernel.setter
    def outdated_kernel(self, value):
        flag_path = self.dv.Get('update.cl_update_outdated_kernel_path')
        try:
            if value:
                with writeFile(flag_path) as f:
                    f.write(self.dv.Get('update.cl_update_kernel_version'))
            else:
                if path.exists(flag_path):
                    os.unlink(flag_path)
        except IOError:
            pass
