# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright 2010 Mariano Hidalgo

# Show Information About the Blend.

bl_info = {
    "name": "Scene Information",
    "author": "uselessdreamer",
    "version": (0, 3, 1),
    "blender": (2, 80, 0),
    "location": "Properties > Scene > Blend Info Panel",
    "description": "Show information about the .blend",
    "warning": "",
    "doc_url": "{BLENDER_MANUAL_URL}/addons/system/blend_info.html",
    "category": "System",
}

import bpy


def quantity_string(quantity, text_single, text_plural, text_none=None):
    sep = " "

    if not text_none:
        text_none = text_plural

    if quantity == 0:
        string = str(quantity) + sep + text_none

    if quantity == 1:
        string = str(quantity) + sep + text_single

    if quantity >= 2:
        string = str(quantity) + sep + text_plural

    if quantity < 0:
        return None

    return string


class OBJECT_PT_blendinfo(bpy.types.Panel):
    bl_label = "Blend Info"
    bl_space_type = "PROPERTIES"
    bl_region_type = "WINDOW"
    bl_context = "scene"
    bl_options = {'DEFAULT_CLOSED'}

    def draw(self, context):
        ob_cols = []
        db_cols = []

        objects = bpy.data.objects

        layout = self.layout

        # OBJECTS

        l_row = layout.row()
        num = len(bpy.data.objects)
        l_row.label(text=quantity_string(num, "Object", "Objects")
            + " in the scene:",
            icon='OBJECT_DATA')

        l_row = layout.row()
        ob_cols.append(l_row.column())
        ob_cols.append(l_row.column())

        row = ob_cols[0].row()
        meshes = [o for o in objects.values() if o.type == 'MESH']
        num = len(meshes)
        row.label(text=quantity_string(num, "Mesh", "Meshes"),
            icon='MESH_DATA')

        row = ob_cols[1].row()
        curves = [o for o in objects.values() if o.type == 'CURVE']
        num = len(curves)
        row.label(text=quantity_string(num, "Curve", "Curves"),
            icon='CURVE_DATA')

        row = ob_cols[0].row()
        cameras = [o for o in objects.values() if o.type == 'CAMERA']
        num = len(cameras)
        row.label(text=quantity_string(num, "Camera", "Cameras"),
            icon='CAMERA_DATA')

        row = ob_cols[1].row()
        lamps = [o for o in objects.values() if o.type == 'LIGHT']
        num = len(lamps)
        row.label(text=quantity_string(num, "Lamp", "Lamps"),
            icon='LIGHT_DATA')

        row = ob_cols[0].row()
        armatures = [o for o in objects.values() if o.type == 'ARMATURE']
        num = len(armatures)
        row.label(text=quantity_string(num, "Armature", "Armatures"),
            icon='ARMATURE_DATA')

        row = ob_cols[1].row()
        lattices = [o for o in objects.values() if o.type == 'LATTICE']
        num = len(lattices)
        row.label(text=quantity_string(num, "Lattice", "Lattices"),
            icon='LATTICE_DATA')

        row = ob_cols[0].row()
        empties = [o for o in objects.values() if o.type == 'EMPTY']
        num = len(empties)
        row.label(text=quantity_string(num, "Empty", "Empties"),
            icon='EMPTY_DATA')

        row = ob_cols[1].row()
        empties = [o for o in objects.values() if o.type == 'SPEAKER']
        num = len(empties)
        row.label(text=quantity_string(num, "Speaker", "Speakers"),
            icon='OUTLINER_OB_SPEAKER')

        layout.separator()

        # DATABLOCKS

        l_row = layout.row()
        num = len(bpy.data.objects)
        l_row.label(text="Datablocks in the scene:")

        l_row = layout.row()
        db_cols.append(l_row.column())
        db_cols.append(l_row.column())

        row = db_cols[0].row()
        num = len(bpy.data.meshes)
        row.label(text=quantity_string(num, "Mesh", "Meshes"),
            icon='MESH_DATA')

        row = db_cols[1].row()
        num = len(bpy.data.curves)
        row.label(text=quantity_string(num, "Curve", "Curves"),
            icon='CURVE_DATA')

        row = db_cols[0].row()
        num = len(bpy.data.cameras)
        row.label(text=quantity_string(num, "Camera", "Cameras"),
            icon='CAMERA_DATA')

        row = db_cols[1].row()
        num = len(bpy.data.lights)
        row.label(text=quantity_string(num, "Lamp", "Lamps"),
            icon='LIGHT_DATA')

        row = db_cols[0].row()
        num = len(bpy.data.armatures)
        row.label(text=quantity_string(num, "Armature", "Armatures"),
            icon='ARMATURE_DATA')

        row = db_cols[1].row()
        num = len(bpy.data.lattices)
        row.label(text=quantity_string(num, "Lattice", "Lattices"),
            icon='LATTICE_DATA')

        row = db_cols[0].row()
        num = len(bpy.data.materials)
        row.label(text=quantity_string(num, "Material", "Materials"),
            icon='MATERIAL_DATA')

        row = db_cols[1].row()
        num = len(bpy.data.worlds)
        row.label(text=quantity_string(num, "World", "Worlds"),
            icon='WORLD_DATA')

        row = db_cols[0].row()
        num = len(bpy.data.textures)
        row.label(text=quantity_string(num, "Texture", "Textures"),
            icon='TEXTURE_DATA')

        row = db_cols[1].row()
        num = len(bpy.data.images)
        row.label(text=quantity_string(num, "Image", "Images"),
            icon='IMAGE_DATA')

        row = db_cols[0].row()
        num = len(bpy.data.texts)
        row.label(text=quantity_string(num, "Text", "Texts"),
            icon='TEXT')

# Register
classes = [
    OBJECT_PT_blendinfo
]

def register():
    from bpy.utils import register_class
    for cls in classes:
        register_class(cls)

def unregister():
    from bpy.utils import unregister_class
    for cls in reversed(classes):
        unregister_class(cls)


if __name__ == "__main__":
    register()
