#!/usr/bin/env python

from matplotlib import pyplot as plt
import numpy as np
import argparse
import sys


# -i → agrs.show → open plot in interactive mode
# -s → args.save → save plot
#
# -n → agrs.note → do the Landau plot with the notes
# -b → args.both → do the Landau-Moyal plot
# -m → args.area → do the Landau median plot


def moyal(x, μ, σ):
    N = (1)/(np.sqrt(2 * np.pi) * σ)
    return N * np.exp(- 0.5 * ((x - μ)/σ + np.exp(- (x - μ)/σ)))


def main(args):
    # prepare figure
    if args.show:
        plt.figure()

    elif args.save:
        plt.rcParams['font.size'] = 8
        if (args.both or args.area):
            plt.figure(figsize=(3, 2))
        elif args.note:
            plt.figure(figsize=(5, 3))

    if args.note:

        # useful coordinates
        y_min = -0.0086     # y min axes
        y_max = 0.1895      # y max axes
        me = -0.22          # mode
        f_me = 0.1806       # f(mode)
        h_f_me = f_me/2     # falf f(mode)
        x_m = -1.5867       # x₋
        x_p = 2.4330        # x₊

        # draw the lines
        plt.plot([-10, me],  [f_me, f_me],     color='gray')
        plt.plot([me, me],  [f_me, y_min],     color='gray')
        plt.plot([-10, x_p], [h_f_me, h_f_me], color='gray')
        plt.plot([x_m, x_m], [y_min, h_f_me],  color='gray')
        plt.plot([x_p, x_p], [y_min, h_f_me],  color='gray')

        # draw the notes
        s = 0.012
        S = 0.2
        plt.annotate('$f(m_e)$',   [-10 + S, f_me - s])
        plt.annotate('$f(m_e)/2$', [-10 + S, h_f_me - s])
        plt.annotate('$x_-$',      [x_m + S, y_min + s/2])
        plt.annotate('$x_+$',      [x_p + S, y_min + s/2])
        plt.annotate('$m_e$',      [me + S, y_min + s/2])

        # prepare plot
        plt.title('Landau distribution', loc='right')
        plt.xlim(-10, 10)
        plt.ylim(y_min, y_max)

    if args.both:
        plt.ylim(-0.015, 0.265)

    # draw Landau plot
    x, y = np.loadtxt(sys.stdin, unpack=True)
    plt.plot(x, y, color='#92182b', label='Landau')

    # Color the area under the function
    if args.area:
        median = 1.3557804
        x0 = np.argmin(abs(median - x))
        plt.fill_between(x[:x0], y[:x0], color='#ff99a8')
        plt.fill_between(x[x0:], y[x0:], color='#b28e94')

    # do Moyal plot
    if args.both:
        μ = -0.22278298
        σ = 1.1191486
        x = np.arange(-10, 30, 0.01)
        plt.plot(x, moyal(x, μ, σ), color='gray', label='Moyal')
        plt.legend()

    # save figure
    plt.tight_layout()
    if args.show:
        plt.show()
    elif args.save:
        if args.note:
            plt.savefig('notes/images/1-notes.pdf')
        if args.both:
            plt.savefig('slides/images/both-pdf.pdf', transparent=True)
        if args.area:
            plt.savefig('slides/images/median.pdf', transparent=True)


if __name__ == '__main__':
    # Parse data
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', '--show',
                        action='store_true', default=False,
                        help='show the plots')
    parser.add_argument('-s', '--save',
                        action='store_true', default=False,
                        help='save the plots')
    parser.add_argument('-b', '--both',
                        action='store_true', default=False,
                        help='do the both plot')
    parser.add_argument('-n', '--note',
                        action='store_true', default=False,
                        help='do the note plot')
    parser.add_argument('-a', '--area',
                        action='store_true', default=False,
                        help='do the area plot')
    args = parser.parse_args()
    main(args)
