"""Radiance raytracing Parameters."""
from ._advancedparametersbase import AdvancedRadianceParameters
from ._frozen import frozen
# TODO: Add a check to make sure user can't set both -s and -d to True.
[docs]@frozen
class GendaymtxParameters(AdvancedRadianceParameters):
    """Radiance Parameters for grid based analysis.
    Read more:
    https://www.radiance-online.org/learning/documentation/manual-pages/pdfs/gendaymtx.pdf
    Attributes:
        verbose_report: [-v] A boolean to indicate verbose reporting (Default: True)
        remove_header: [-h] A boolean to disable header (Default: False)
        only_direct: [-d] A boolean to only generate sun-only matrix (Default: False)
        only_sky: [-s] A boolean to only generate sky matrix with no direct sun
            (Default: False)
        rotation: [-r deg] A floating number in degrees that indicates zenith
            rotation (Default: 0)
        sky_density: [-m N] An integer to indicate number of sky patches. Default
            value of 1 generates 146 sky pacthes.
        ground_color: [-g r g b] A tuple of r, g, b values to indicate ground
            color (Default:  0.2 0.2 0.2)
        sky_color: [-c r g b] A tuple of r, g, b values to indicate sky color
            (Default: 0.960, 1.004, 1.118)
        output_format: [-o{f|d}] An integer to indicate binary output format.
            0 is double output [d] and 1 is binary float numbers (f). If you're
            running Radiance on Windows do not use this option. (Default: None)
        output_type: [-O{0|1}] An integr specifies output type. 0 generates the
            values for visible radiance whereas 1 indicates the results should
            be total solar radiance.
        * For the full list of attributes try self.parameters
        ** values between []'s indicate Radiance equivalent keys for advanced users
    Usage:
        # generate sky matrix with default values
        gmtx = GendaymtxParameters()
        # check the current values
        print(gmtx.to_rad_string())
        > -v -r 0 -m 1 -of
        # ask only for direct sun
        gmtx.only_direct = True
        # check the new values. -d is added.
        print(gmtx.to_rad_string())
        > -v -d -r 0 -m 1 -of
    """
    def __init__(self, verbose_report=True, remove_header=False, only_direct=False,
                 only_sky=False, rotation=0, sky_density=1, ground_color=None,
                 sky_color=None, output_format=None, output_type=None):
        """Init paramters."""
        AdvancedRadianceParameters.__init__(self)
        # convert user input to radiance output formats
        _output_format = {0: 'f', 1: 'd', None: None}
        # add parameters
        self.add_radiance_bool_flag('v', 'verbose reporting',
                                    attribute_name='verbose_report')
        self.verbose_report = verbose_report
        """[-v] A boolean to indicate verbose reporting (Default: True)"""
        self.add_radiance_bool_flag('h', 'disable header',
                                    attribute_name='remove_header')
        self.remove_header = remove_header
        """[-h] A boolean to disable header (Default: False)"""
        self.add_radiance_bool_flag('d', 'sun mtx only',
                                    attribute_name='only_direct')
        self.only_direct = only_direct
        """[-d] A boolean to only generate sun-only matrix (Default: False)"""
        self.add_radiance_bool_flag('s', 'sky mtx only', attribute_name='only_sky')
        self.only_sky = only_sky
        """[-s] A boolean to only generate sky matrix with no direct sun
           (Default: False)"""
        self.add_radiance_number('r', 'zenith rotation', num_type=float,
                                 attribute_name='rotation')
        self.rotation = rotation
        """[-r deg] A floating number in degrees that indicates zenith
           rotation (Default: 0)"""
        self.add_radiance_number('m', 'sky patches', num_type=int,
                                 check_positive=True,
                                 attribute_name='sky_density')
        self.sky_density = sky_density
        """ [-m N] An integer to indicate number of sky patches. Default
            value of 1 generates 146 sky pacthes."""
        self.add_radiance_tuple('g', 'ground color', valid_range=(0, 1),
                                tuple_size=3, num_type=float,
                                attribute_name='ground_color')
        self.ground_color = ground_color
        """ [-g r g b] A tuple of r, g, b values to indicate ground
            color (Default:  0.2 0.2 0.2)"""
        self.add_radiance_tuple('c', 'sky color', valid_range=(0, 1), tuple_size=3,
                                num_type=float, attribute_name='sky_color')
        self.sky_color = sky_color
        """ [-c r g b] A tuple of r, g, b values to indicate sky color
            (Default: 0.960, 1.004, 1.118)"""
        self.add_radiance_value('o', 'output format',
                                accepted_inputs=('f', 'd'), is_joined=True,
                                attribute_name='output_format')
        self.output_format = _output_format[output_format]
        """ [-o{f|d}] An integer to indicate binary output format.
            0 is double output [d] and 1 is binary float numbers (f). If you're
            running Radiance on Windows do not use this option. (Default: None)
        """
        self.add_radiance_value('O', 'radiation type',
                                accepted_inputs=(0, 1, '0', '1'), is_joined=True,
                                attribute_name='output_type')
        self.output_type = output_type
        """ [-O{0|1}] An integr specifies output type. 0 generates the
            values for visible radiance whereas 1 indicates the results should
            be total solar radiance."""
        assert self.only_direct * self.only_sky == 0, \
            
"You can only set one of the only_direct and only_sky to True."