#!/usr/local/sal/Python.framework/Versions/3.8/bin/python3


import pathlib
import plistlib
import subprocess
import tempfile

import sal


__version__ = '1.0.0'


def main():
    profiles = get_profiles()
    submission = {}
    submission['facts'] = {'checkin_module_version': __version__}
    submission['managed_items'] = {}
    for profile in profiles.get('_computerlevel', []):
        name = profile['ProfileDisplayName']
        submission_item = {}
        submission_item['name'] = name
        submission_item['date_managed'] = profile['ProfileInstallDate']
        submission_item['status'] = 'PRESENT'

        data = {}
        payloads = profile.get('ProfileItems', [])
        for count, payload in enumerate(payloads, start=1):
            data[f'payload {count}'] = payload

        data['payload_types'] = ', '.join(p['PayloadType'] for p in payloads)
        data['profile_description'] = profile.get('ProfileDescription', 'None')
        data['identifier'] = profile['ProfileIdentifier']
        data['organization'] = profile['ProfileOrganization'] or 'None'
        data['uuid'] = profile['ProfileUUID']
        data['verification_state'] = profile.get('ProfileVerificationState', '')
        submission_item['data'] = data

        submission['managed_items'][name] = submission_item

    sal.set_checkin_results('Profiles', submission)


def get_profiles():
    try:
        temp_dir = pathlib.Path(tempfile.mkdtemp())
        profile_out = temp_dir / 'profiles.plist'

        cmd = ['/usr/bin/profiles', '-C', '-o', profile_out]
        # dev_null = open(os.devnull, 'w')
        try:
            subprocess.call(cmd, stdout=subprocess.PIPE)
        except OSError:
            return {}

        try:
            profiles = plistlib.loads(profile_out.read_bytes())
        except plistlib.InvalidFileException:
            return {}
    finally:
        profile_out.unlink(missing_ok=True)
        temp_dir.rmdir()

    return profiles


if __name__ == "__main__":
    main()