"""
PyMBS is a Python library for use in modeling Mortgage-Backed Securities.

Copyright (C) 2019  Brian Farrell

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 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 Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.

Contact: brian.farrell@me.com

The log module reads-in the pymbs_logging.json file and sets up logging for
PyMBS.

The PyMBS log file is located at ~/.local/log/pymbs.log

"""

import json
import logging
import logging.config
from pathlib import Path
import os
import sys

from pymbs.enums import ExitCode

platform = sys.platform

PYMBS_BASE_PATH = Path(__file__).parent

log_dir = 'pymbs'
log_file = 'pymbs.log'
rel_log_path = Path(log_dir, log_file)
user_home_dir = Path.home()
log_dir_mode = 0o774

if platform == 'darwin':
    pymbs_log_dir = Path(user_home_dir, '.local', 'log', log_dir)
elif platform == 'linux':
    pymbs_log_dir = Path('var', 'log', log_dir)
elif platform == 'win32':
    pymbs_log_dir = Path(user_home_dir, 'AppData', 'Local', log_dir)

if not pymbs_log_dir.exists():
    pymbs_log_dir.mkdir(mode=log_dir_mode, parents=True)

PYMBS_LOG_FILE = Path(pymbs_log_dir, log_file)

if not PYMBS_LOG_FILE.exists():
    PYMBS_LOG_FILE.touch()

PYMBS_LOG_CONFIG = Path(PYMBS_BASE_PATH, 'config', 'pymbs_logging.json')

PYMBS_LOG_LEVEL = 'INFO'


def _get_logging_config(env_log_level='PYMBS_LOG_LEVEL',
                        env_log_config='PYMBS_LOG_CONFIG',
                        env_log_file='PYMBS_LOG_FILE'):
    """Setup logging configuration."""
    value = os.getenv(env_log_config)
    if value:
        log_config_path = value
    else:
        log_config_path = PYMBS_LOG_CONFIG

    try:
        with open(log_config_path, 'rt') as f:
            logging_config = json.load(f)
    except OSError:
        print(f"Failed to open PyMBS logging configuration file at "
              f"{log_config_path}\nExiting...\n\n")
        sys.exit(ExitCode.EX_NOINPUT)

    value = os.getenv(env_log_file)
    if value:
        pymbs_log_file = value
    else:
        pymbs_log_file = PYMBS_LOG_FILE
    logging_config['handlers']['default_handler']['filename'] = pymbs_log_file

    value = os.getenv(env_log_level)
    if value:
        pymbs_log_level = value
    else:
        pymbs_log_level = PYMBS_LOG_LEVEL
    logging_config['loggers']['pymbs']['level'] = pymbs_log_level

    return logging_config


logging.config.dictConfig(_get_logging_config())


def get_logger(logger_name):
    logger = logging.getLogger(logger_name)

    return logger
