#!/usr/bin/env python3


"""
Automatically finds n, the number of core electrons. Calls qp_set_mo_class
setting all MOs as Active, except the n/2 first ones which are set as Core.
If pseudo-potentials are used, all the MOs are set as Active.

Usage:
      qp_set_frozen_core [-q|--query] [(-l|-s|-u|--large|--small|--unset)] EZFIO_DIR

Options:
    -q --query   Prints in the standard output the number of frozen MOs
    -l --large   Use a small core
    -s --small   Use a large core
    -u --unset   Unset frozen core


Default numbers of frozen electrons:

      ========== ========= ======= ======= 
        Range     Default   Small   Large  
      ========== ========= ======= ======= 
       H  -> He      0        0        0   
       Li -> Be      0        0        2   
       B  -> Ne      2        2        2   
       Na -> Mg      2        2       10   
       Al -> Ar     10        2       10   
       K  -> Ca     10       10       18   
       Sc -> Zn     10       10       18   
       Ga -> Kr     18       10       18   
       Rb -> Sr     18       18       36   
       Y  -> Cd     18       18       36   
       In -> Xe     36       18       36   
       Cs -> Ba     36       36       54   
       La -> Hg     36       36       54   
       Tl -> Rn     54       36       54   
       Fr -> Ra     54       54       86   
       Ac -> Cn     54       54       86   
       Nh -> Og     86       54       86
      ========== ========= ======= ======= 


"""

import os
import sys
import os.path

try:
    import qp_path
except ImportError:
    print("source quantum_package.rc")
    raise

from docopt import docopt
from ezfio import ezfio


def main(arguments):
    """Main function"""

    filename = arguments["EZFIO_DIR"]
    ezfio.set_filename(filename)

    n_frozen = 0
    try:
        do_pseudo = ezfio.pseudo_do_pseudo
    except:
        do_pseudo = False


    if not do_pseudo:

        if arguments["--large"]:
            for charge in ezfio.nuclei_nucl_charge:
                if   charge <=   2: pass
                elif charge <=  10: n_frozen += 1                                             
                elif charge <=  18: n_frozen += 5
                elif charge <=  36: n_frozen += 9
                elif charge <=  54: n_frozen += 18
                elif charge <=  86: n_frozen += 27
                elif charge <= 118: n_frozen += 43

        elif arguments["--small"]:
                if   charge <=   4: pass
                elif charge <=  18: n_frozen += 1
                elif charge <=  36: n_frozen += 5
                elif charge <=  54: n_frozen += 9
                elif charge <=  86: n_frozen += 18
                elif charge <= 118: n_frozen += 27
        elif arguments["--unset"]:

              n_frozen = 0
        else:  # default                                                                      
            for charge in ezfio.nuclei_nucl_charge:
                if   charge <=   4: pass
                elif charge <=  12: n_frozen += 1
                elif charge <=  30: n_frozen += 5
                elif charge <=  48: n_frozen += 9
                elif charge <=  80: n_frozen += 18
                elif charge <= 112: n_frozen += 27


    mo_num = ezfio.mo_basis_mo_num

    if arguments["--query"]:
        print(n_frozen)
        sys.exit(0)

    if n_frozen == 0:
        os.system("""qp_set_mo_class -a "[1-%d]" %s""" %
                  (mo_num, filename))
    else:
        os.system("""qp_set_mo_class -c "[1-%d]" -a "[%d-%d]" %s""" %
                  (n_frozen, n_frozen+1, mo_num, filename))



if __name__ == '__main__':
    ARGUMENTS = docopt(__doc__)
    main(ARGUMENTS)
