#!/usr/bin/env python
# encoding=utf-8
# Copyright © 2016 Intel Corporation

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

"""Generates isl_format_layout.c."""

from __future__ import absolute_import, division, print_function
import argparse
import csv
import re
import textwrap
import sys

# --pythonpath must be the first argument
sys.path.append(sys.argv[2])

from mako import template

# Load the template, ensure that __future__.division is imported, and set the
# bytes encoding to be utf-8. This last bit is important to getting simple
# consistent behavior for python 3 when we get there.
TEMPLATE = template.Template(future_imports=['division'],
                             output_encoding='utf-8',
                             text="""\
/* This file is autogenerated by gen_format_layout.py. DO NOT EDIT! */

/*
 * Copyright 2015 Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 */

#include "isl/isl.h"

const struct isl_format_layout
isl_format_layouts[] = {
% for format in formats:
  [ISL_FORMAT_${format.name}] = {
    .format = ISL_FORMAT_${format.name},
    .name = "ISL_FORMAT_${format.name}",
    .bpb = ${format.bpb},
    .bw = ${format.bw},
    .bh = ${format.bh},
    .bd = ${format.bd},
    .channels = {
    % for mask in ['r', 'g', 'b', 'a', 'l', 'i', 'p']:
      <% channel = getattr(format, mask, None) %>\\
      % if channel.type is not None:
        .${mask} = { ISL_${channel.type}, ${channel.size} },
      % else:
        .${mask} = {},
      % endif
    % endfor
    },
    .colorspace = ISL_COLORSPACE_${format.colorspace},
    .txc = ISL_TXC_${format.txc},
  },

% endfor
};

enum isl_format
isl_format_srgb_to_linear(enum isl_format format)
{
    switch (format) {
% for srgb, rgb in srgb_to_linear_map:
    case ISL_FORMAT_${srgb}:
        return ISL_FORMAT_${rgb};
%endfor
    default:
        return format;
    }
}
""")


class Channel(object):
    """Class representing a Channel.

    Converts the csv encoded data into the format that the template (and thus
    the consuming C code) expects.

    """
    # If the csv file grew very large this class could be put behind a factory
    # to increase efficiency. Right now though it's fast enough that It didn't
    # seem worthwhile to add all of the boilerplate
    _types = {
        'x': 'void',
        'r': 'raw',
        'un': 'unorm',
        'sn': 'snorm',
        'uf': 'ufloat',
        'sf': 'sfloat',
        'ux': 'ufixed',
        'sx': 'sfixed',
        'ui': 'uint',
        'si': 'sint',
        'us': 'uscaled',
        'ss': 'sscaled',
    }
    _splitter = re.compile(r'\s*(?P<type>[a-z]+)(?P<size>[0-9]+)')

    def __init__(self, line):
        # If the line is just whitespace then just set everything to None to
        # save on the regex cost and let the template skip on None.
        if line.isspace():
            self.size = None
            self.type = None
        else:
            grouped = self._splitter.match(line)
            self.type = self._types[grouped.group('type')].upper()
            self.size = grouped.group('size')


class Format(object):
    """Class taht contains all values needed by the template."""
    def __init__(self, line):
        # pylint: disable=invalid-name
        self.name = line[0].strip()

        # Future division makes this work in python 2.
        self.bpb = int(line[1])
        self.bw = line[2].strip()
        self.bh = line[3].strip()
        self.bd = line[4].strip()
        self.r = Channel(line[5])
        self.g = Channel(line[6])
        self.b = Channel(line[7])
        self.a = Channel(line[8])
        self.l = Channel(line[9])
        self.i = Channel(line[10])
        self.p = Channel(line[11])

        # alpha doesn't have a colorspace of it's own.
        self.colorspace = line[12].strip().upper()
        if self.colorspace in ['', 'ALPHA']:
            self.colorspace = 'NONE'

        # This sets it to the line value, or if it's an empty string 'NONE'
        self.txc = line[13].strip().upper() or 'NONE'


def reader(csvfile):
    """Wrapper around csv.reader that skips comments and blanks."""
    # csv.reader actually reads the file one line at a time (it was designed to
    # open excel generated sheets), so hold the file until all of the lines are
    # read.
    with open(csvfile, 'r') as f:
        for line in csv.reader(f):
            if line and not line[0].startswith('#'):
                yield line

def get_srgb_to_linear_map(formats):
    """Compute a map from sRGB to linear formats.

    This function uses some probably somewhat fragile string munging to do
    the conversion.  However, we do assert that, if it's SRGB, the munging
    succeeded so that gives some safety.
    """
    names = {f.name for f in formats}
    for fmt in formats:
        if fmt.colorspace != 'SRGB':
            continue

        replacements = [
            ('_SRGB',   ''),
            ('SRGB',    'RGB'),
            ('U8SRGB',  'FLT16'),
        ]

        found = False;
        for rep in replacements:
            rgb_name = fmt.name.replace(rep[0], rep[1])
            if rgb_name in names:
                found = True
                yield fmt.name, rgb_name
                break;

        # We should have found a format name
        assert found

def main():
    """Main function."""
    parser = argparse.ArgumentParser()
    parser.add_argument('--pythonpath')
    parser.add_argument('--csv', action='store', help='The CSV file to parse.')
    parser.add_argument(
        '--out',
        action='store',
        help='The location to put the generated C file.')
    args = parser.parse_args()

    # This generator opens and writes the file itself, and it does so in bytes
    # mode. This solves both python 2 vs 3 problems and solves the locale
    # problem: Unicode can be rendered even if the shell calling this script
    # doesn't.
    with open(args.out, 'wb') as f:
        formats = [Format(l) for l in reader(args.csv)]
        try:
            # This basically does lazy evaluation and initialization, which
            # saves on memory and startup overhead.
            f.write(TEMPLATE.render(
                formats             = formats,
                srgb_to_linear_map  = list(get_srgb_to_linear_map(formats)),
            ))
        except Exception:
            # In the even there's an error this imports some helpers from mako
            # to print a useful stack trace and prints it, then exits with
            # status 1, if python is run with debug; otherwise it just raises
            # the exception
            if __debug__:
                import sys
                from mako import exceptions
                print(exceptions.text_error_template().render(),
                      file=sys.stderr)
                sys.exit(1)
            raise


if __name__ == '__main__':
    main()
