#!/usr/bin/env python3
#
# Copyright (C) 2021-2023 VyOS maintainers and contributors
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 or later as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import argparse

from sys import exit
from vyos.configquery import ConfigTreeQuery
from vyos.utils.process import cmd

parser = argparse.ArgumentParser()
parser.add_argument("--model", help="Get module model", action="store_true")
parser.add_argument("--revision", help="Get module revision", action="store_true")
parser.add_argument("--capabilities", help="Get module capabilities", action="store_true")
parser.add_argument("--imei", help="Get module IMEI/ESN/MEID", action="store_true")
parser.add_argument("--imsi", help="Get module IMSI", action="store_true")
parser.add_argument("--msisdn", help="Get module MSISDN", action="store_true")
parser.add_argument("--sim", help="Get SIM card status", action="store_true")
parser.add_argument("--signal", help="Get current RF signal info", action="store_true")
parser.add_argument("--firmware", help="Get current RF signal info", action="store_true")

required = parser.add_argument_group('Required arguments')
required.add_argument("--interface", help="WWAN interface name, e.g. wwan0", required=True)

def qmi_cmd(device, command, silent=False):
    try:
        tmp = cmd(f'qmicli --device={device} --device-open-proxy {command}')
        tmp = tmp.replace(f'[{cdc}] ', '')
        if not silent:
            # skip first line as this only holds the info headline
            for line in tmp.splitlines()[1:]:
                print(line.lstrip())
        return tmp
    except:
        print('Command not supported by Modem')
        exit(1)

if __name__ == '__main__':
    args = parser.parse_args()

    tmp = ConfigTreeQuery()
    if not tmp.exists(['interfaces', 'wwan', args.interface]):
        print(f'Interface "{args.interface}" unconfigured!')
        exit(1)

    # remove the WWAN prefix from the interface, required for the CDC interface
    if_num = args.interface.replace('wwan','')
    cdc = f'/dev/cdc-wdm{if_num}'

    if args.model:
        qmi_cmd(cdc, '--dms-get-model')
    elif args.capabilities:
        qmi_cmd(cdc, '--dms-get-capabilities')
        qmi_cmd(cdc, '--dms-get-band-capabilities')
    elif args.revision:
        qmi_cmd(cdc, '--dms-get-revision')
    elif args.imei:
        qmi_cmd(cdc, '--dms-get-ids')
    elif args.imsi:
        qmi_cmd(cdc, '--dms-uim-get-imsi')
    elif args.msisdn:
        qmi_cmd(cdc, '--dms-get-msisdn')
    elif args.sim:
        qmi_cmd(cdc, '--uim-get-card-status')
    elif args.signal:
        qmi_cmd(cdc, '--nas-get-signal-info')
        qmi_cmd(cdc, '--nas-get-rf-band-info')
    elif args.firmware:
        tmp = qmi_cmd(cdc, '--dms-get-manufacturer', silent=True)
        if 'Sierra Wireless' in tmp:
            qmi_cmd(cdc, '--dms-swi-get-current-firmware')
        else:
            qmi_cmd(cdc, '--dms-get-software-version')
    else:
        parser.print_help()
        exit(1)