#!/usr/bin/env python
"""
Write a single column model input file as would be generated by the
OpenIFS SCMTileRunner class.

"""
# Copyright 2016 Andrew Dawson
#
# 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.

from argparse import ArgumentParser
import sys

from scmtiles.config import SCMTilesConfig
from scmtiles.exceptions import ConfigurationError, TileInitializationError
from scmtiles.grid_manager import LinearTile

from openifs_scm import SCMTileRunner


def construct_tile(cell_indices, xsize, ysize):
    linear_cell_index = cell_indices[1] * xsize + cell_indices[0]
    tile = LinearTile(0, slice(linear_cell_index, linear_cell_index + 1),
                      [cell_indices[0]], [cell_indices[1]])
    return tile


def main(argv=None):
    if argv is None:
        argv = sys.argv
    ap = ArgumentParser(description=__doc__)
    ap.add_argument('-c', '--cell', type=int, nargs=2,
                    help='the x and y index of the required cell')
    ap.add_argument('-o', '--output_directory', type=str,
                    help='directory to write the output in')
    ap.add_argument('config_file_path', type=str,
                    help='path to the program configuration file')
    argns = ap.parse_args(argv[1:])
    try:
        config = SCMTilesConfig.from_file(argns.config_file_path)
        cell = argns.cell or [0, 0]
        tile = construct_tile(cell, config.xsize, config.ysize)
        tr = SCMTileRunner(config, tile)
        cell = next(tile.cells())
        output_directory = argns.output_directory or '.'
        tr.write_scm_input(cell, output_directory)
    except (ConfigurationError, TileInitializationError) as e:
        print("error: {!s}".format(e), file=sys.stderr)
        return 1
    return 0


if __name__ == '__main__':
    sys.exit(main())
