# -*- mode: python -*-
# -*- coding: utf-8 -*-

##############################################################################
#
# ScoDoc
#
# Copyright (c) 1999 - 2022 Emmanuel Viennet.  All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#   Emmanuel Viennet      emmanuel.viennet@viennet.net
#
##############################################################################

"""

"""
from app.models import ScoDocSiteConfig
from app.scodoc.sco_logos import write_logo, find_logo, delete_logo
import app
from flask import current_app


class Action:
    """Base class for all classes describing an action from from config form."""

    def __init__(self, message, parameters):
        self.message = message
        self.parameters = parameters

    @staticmethod
    def build_action(parameters, stream=None):
        """Check (from parameters) if some action has to be done and
        then return list of action (or else return empty list)."""
        raise NotImplementedError

    def display(self):
        """return a str describing the action to be done"""
        return self.message.format_map(self.parameters)

    def execute(self):
        """Executes the action"""
        raise NotImplementedError


GLOBAL = "_"


class LogoUpdate(Action):
    """Action: change a logo
    dept_id: dept_id or '_',
    logo_id: logo_id,
    upload: image file replacement
    """

    def __init__(self, parameters):
        super().__init__(
            f"Modification du logo {parameters['logo_id']} pour le département {parameters['dept_id']}",
            parameters,
        )

    @staticmethod
    def build_action(parameters):
        dept_id = parameters["dept_key"]
        if dept_id == GLOBAL:
            dept_id = None
        parameters["dept_id"] = dept_id
        if parameters["upload"] is not None:
            return LogoUpdate(parameters)
        return None

    def execute(self):
        current_app.logger.info(self.message)
        write_logo(
            stream=self.parameters["upload"],
            dept_id=self.parameters["dept_id"],
            name=self.parameters["logo_id"],
        )


class LogoDelete(Action):
    """Action: Delete an existing logo
    dept_id: dept_id or '_',
    logo_id: logo_id
    """

    def __init__(self, parameters):
        super().__init__(
            f"Suppression du logo {parameters['logo_id']} pour le département {parameters['dept_id'] or 'tous'}.",
            parameters,
        )

    @staticmethod
    def build_action(parameters):
        parameters["dept_id"] = parameters["dept_key"]
        if parameters["dept_key"] == GLOBAL:
            parameters["dept_id"] = None
        if parameters["do_delete"]:
            return LogoDelete(parameters)
        return None

    def execute(self):
        current_app.logger.info(self.message)
        delete_logo(name=self.parameters["logo_id"], dept_id=self.parameters["dept_id"])


class LogoInsert(Action):
    """Action: add a new logo
    dept_key: dept_id or '_',
    logo_id: logo_id,
    upload: image file replacement
    """

    def __init__(self, parameters):
        super().__init__(
            f"Ajout du logo {parameters['name']} pour le département {parameters['dept_key']} ({parameters['upload'].filename}).",
            parameters,
        )

    @staticmethod
    def build_action(parameters):
        if parameters["dept_key"] == GLOBAL:
            parameters["dept_id"] = None
        if parameters["upload"] and parameters["name"]:
            logo = find_logo(
                logoname=parameters["name"], dept_id=parameters["dept_key"]
            )
            if logo is None:
                return LogoInsert(parameters)
        return None

    def execute(self):
        dept_id = self.parameters["dept_key"]
        if dept_id == GLOBAL:
            dept_id = None
        current_app.logger.info(self.message)
        write_logo(
            stream=self.parameters["upload"],
            name=self.parameters["name"],
            dept_id=dept_id,
        )


class BonusSportUpdate(Action):
    """Action: Change bonus_sport_function_name.
    bonus_sport_function_name: the new value"""

    def __init__(self, parameters):
        super().__init__(
            f"Changement du calcul de bonus sport pour ({parameters['bonus_sport_func_name']}).",
            parameters,
        )

    @staticmethod
    def build_action(parameters):
        if (
            parameters["bonus_sport_func_name"]
            != ScoDocSiteConfig.get_bonus_sport_func_name()
        ):
            return [BonusSportUpdate(parameters)]
        return []

    def execute(self):
        current_app.logger.info(self.message)
        ScoDocSiteConfig.set_bonus_sport_func(self.parameters["bonus_sport_func_name"])
        app.clear_scodoc_cache()