================================================================================
Camera Support
================================================================================

.. exec::
    from xml.dom.minidom import parse
    import xml.dom.minidom
    import sys
    import csv

    DOMTree = xml.dom.minidom.parse("data/cameras.xml")
    cameras = DOMTree.documentElement.getElementsByTagName("Camera")

    unique_makes = dict()

    for camera in cameras:
        make = ''
        model = ''

        if len(camera.getElementsByTagName('ID')) > 0:
            ID = camera.getElementsByTagName('ID')[0]
            make = ID.getAttribute("make")
            model = ID.getAttribute("model")
        else:
            make = camera.getAttribute("make")
            model = camera.getAttribute("model")

        unique_makes[make] = unique_makes.get(make, dict())
        unique_makes[make][model] = unique_makes[make].get(model, dict())
        unique_makes[make][model]['modes'] = unique_makes[
            make][model].get('modes', set())
        unique_makes[make][model]['aliases'] = unique_makes[
            make][model].get('aliases', set())

        mode = camera.getAttribute("mode")
        if mode == '':
            mode = 'Default mode'
        if camera.hasAttribute("supported") and camera.getAttribute("supported") == 'no':
            mode += " - *unsupported*"

        unique_makes[make][model]['modes'].add(mode)

        for alias in camera.getElementsByTagName('Alias'):
            if alias.getAttribute("id") != '':
                unique_makes[make][model][
                    'aliases'].add(alias.getAttribute("id"))
            else:
                unique_makes[make][model][
                    'aliases'].add(alias.childNodes[0].data)

    from collections import OrderedDict

    unique_makes = OrderedDict(sorted(unique_makes.items()))

    print("There are %i known camera makers, " % len(unique_makes))

    count_unique_makesmodels = 0
    for make, models in unique_makes.items():
        count_unique_makesmodels += len(models)

    print("%i known unique camera models.\n" % count_unique_makesmodels)

    print(
        "Any support is impossible without the samples.\nCurrently, |rpu-button-cameras| cameras have samples, with total count of |rpu-button-samples| unique samples. **Please contribute samples**!\n\n")

    print(".. csv-table:: Supported cameras")
    print("   :header-rows: 1")

    print("")

    sys.stdout.flush()

    csvwriter = csv.writer(sys.stdout, delimiter=',',
                           quotechar='\"', quoting=csv.QUOTE_ALL)

    # Header
    sys.stdout.write("   ")
    csvwriter.writerow(['Maker', 'Camera', 'Supported', 'Aliases', 'Modes'])

    # Rows
    for make, models in unique_makes.items():
        models = OrderedDict(sorted(models.items()))
        for model, content in models.items():
            # Leaf cameras have aliases in their model name, we need to split them here
            aliases = model.split("/")
            model_name = aliases[0]

            # Concatenate official aliases with the ones we found above
            aliases = list(content['aliases']) + aliases[1:]

            modes = [mode for mode in content['modes']
                    if "unsupported" not in mode]

            if len(modes) == 0:
                supported = "✗"
            else:
                supported = "✓"

            sys.stdout.write("   ")
            csvwriter.writerow([make, model_name, supported, ', '.join(aliases), ', '.join(content['modes'])])


.. |rpu-button-cameras| image:: https://raw.pixls.us/button-cameras.svg
    :target: https://raw.pixls.us/

.. |rpu-button-samples| image:: https://raw.pixls.us/button-samples.svg
    :target: https://raw.pixls.us/
