#! /usr/bin/env python3
# -*- coding: iso-8859-15 -*-

import matplotlib as mpl
mpl.use('Agg') # necessary to be able to generate the reports even without X server
import matplotlib.pyplot as plt

import datetime
import numpy as np
from . import gravi_visual_class
        
#==============================================================================
# Preparation of the report using reportlab
#==============================================================================
def produce_disp_report(disp,filename):
    # From gravi_visual_class
    from . import gravi_visual_class
    from .gravi_visual_class import myFirstPage, myLaterPages, styles
    from .gravi_visual_class import clipdata, transbarchartout, graphoutaxes, graphoutnoaxis
    from .gravi_visual_class import graphoutnoxaxes, graphscatteraxes, graphaxesplt
    from .gravi_visual_class import plotTitle, plotSubtitle
    from .gravi_visual_class import get_key_withdefault, create_array_from_list, baseline_phases
    from .gravi_visual_class import mean_angle, std_angle, clean_unwrap_phase, nanaverage
    from .gravi_visual_class import clean_gdelay_is, clean_gdelay_fft, clean_gdelay_full
    from .gravi_visual_class import base_list, tel_list, nbase, ntel, round_to_n
    from .gravi_visual_class import plotReductionSummary, plotSummary, plotQCSummary
    
    from .gravi_visual_class import graphoutdarkaxes

    from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image, PageBreak
    from reportlab.graphics.shapes import String
    from reportlab.lib.units import inch, cm, mm
    from reportlab.lib import colors
    import io
    from io import StringIO

    #==============================================================================
    # Global parameters
    #==============================================================================

    datatype = disp.header['HIERARCH ESO PRO CATG']
    specres = disp.header['HIERARCH ESO INS SPEC RES']
    plotmargin = 0.15

    hsize = 16*cm
    vsize = 5*cm

    #==============================================================================
    # Start Story
    #==============================================================================
    
    Story = [Spacer(1,1*mm)]
    plotSummary (Story, filename, disp, onTarget=False)
    plotQCSummary (Story, disp, 'HIERARCH ESO QC DISP *')
    
    #==============================================================================
    # Summary of reduction parameters
    #==============================================================================

    plotReductionSummary(Story, disp)
    Story.append(PageBreak())
    
        
    #==============================================================================
    # BETA
    #==============================================================================
    
    plotTitle(Story,"N_MEAN dispersion coefficients")
    plotSubtitle(Story,"Measured N_MEAN at Argon wavelengths [um] (color = beam)")

    xmin = 1.9
    xmax = 2.5
    tickx = 0.1

    value = disp.nmean_waveth
    ymin = np.min(value)
    ymax = np.max(value)
    ticky = round_to_n((ymax-ymin)/5)
    
    data = []
    for tel in range(0,4):
        data.append( tuple(zip(disp.waveth, value[tel,:]) ))
    a = graphoutaxes(data,xmin,xmax,'%.2f',ymin-ticky,ymax+ticky,'%.2e',hsize,vsize,tickx,ticky,None)
    # a = graphscatteraxes(data,xmin,xmax,'%.2f',ymin-ticky,ymax+ticky,'%.2e',hsize,vsize,tickx,ticky,5.0,None)
    Story.append(a)
    
    Story.append(Spacer(1,15*mm))
    plotSubtitle(Story,"Poynomial model - measures at Argon wavelengths [um] (color = beam)")
    
    wave = (disp.wave0/disp.waveth - 1.)[None,:]**np.array(list(range(0,3)))[:,None]
    res = value - np.sum (disp.nmean[:,:,None] * wave[None,:,:], axis=1)
    
    ymin = np.min(res)
    ymax = np.max(res)
    ticky = round_to_n((ymax-ymin)/5)
    
    data = []
    for tel in range(0,4):
        data.append( tuple(zip(disp.waveth, res[tel,:]) ))
    a = graphoutaxes(data,xmin,xmax,'%.2f',ymin-ticky,ymax+ticky,'%.2e',hsize,vsize,tickx,ticky,None)
    Story.append(a)

    Story.append(Spacer(1,15*mm))
    plotSubtitle(Story,"Polynomial model - measures at OI_WAVE wavelengths [um] (color = beam)")

    wave = (disp.wave0/disp.wave - 1.)[None,:]**np.array(list(range(0,3)))[:,None]
    res = disp.beta_wave*disp.wave/disp.lbdmet - np.sum (disp.nmean[:,:,None] * wave[None,:,:], axis=1)
    
    ymin = np.min(res)
    ymax = np.max(res)
    ticky = round_to_n((ymax-ymin)/5)
    
    data = []
    for tel in range(0,4):
        data.append( tuple(zip(disp.wave, res[tel,:]) ))
    a = graphoutaxes(data,xmin,xmax,'%.2f',ymin-ticky,ymax+ticky,'%.2e',hsize,vsize,tickx,ticky,None)
    Story.append(a)

    Story.append(PageBreak())

    #==============================================================================
    # GAMMA
    #==============================================================================
    
    plotTitle(Story,"N_DIFF dispersion coefficients")
    plotSubtitle(Story,"Measured N_DIFF at Argon wavelength [um] (color = beam)")

    value = disp.ndiff_waveth
    ymin = np.min(value)
    ymax = np.max(value)
    ticky = round_to_n((ymax-ymin)/5)
    
    data = []
    for tel in range(0,4):
        data.append( tuple(zip(disp.waveth, value[tel,:]) ))
    a = graphoutaxes(data,xmin,xmax,'%.2f',ymin-ticky,ymax+ticky,'%.2e',hsize,vsize,tickx,ticky,None)
    Story.append(a)
    Story.append(Spacer(1,15*mm))

    #==============================================================================
    plotSubtitle(Story,"Residual N_DIFF from polynomial model (color = beam)")
    
    wave = (disp.wave0/disp.waveth - 1.)[None,:]**np.array(list(range(0,3)))[:,None]
    res = value - np.sum (disp.ndiff[:,:,None] * wave[None,:,:], axis=1)
    
    ymin = np.min(res)
    ymax = np.max(res)
    ticky = round_to_n((ymax-ymin)/5)
    
    data = []
    for tel in range(0,4):
        data.append( tuple(zip(disp.waveth, res[tel,:]) ))
    a = graphoutaxes(data,xmin,xmax,'%.2f',ymin-ticky,ymax+ticky,'%.2e',hsize,vsize,tickx,ticky,None)
    Story.append(a)
    Story.append(Spacer(1,15*mm))

    #==============================================================================
    plotSubtitle(Story,"Polynomial model - measured N_DIFF at OI_WAVE wavelengths [um] (color = beam)")

    wave = (disp.wave0/disp.wave - 1.)[None,:]**np.array(list(range(0,3)))[:,None]
    res = disp.gamma_wave*disp.wave/disp.lbdmet - np.sum (disp.ndiff[:,:,None] * wave[None,:,:], axis=1)
    
    ymin = np.min(res)
    ymax = np.max(res)
    ticky = round_to_n((ymax-ymin)/5)
    
    data = []
    for tel in range(0,4):
        data.append( tuple(zip(disp.wave, res[tel,:]) ))
    a = graphoutaxes(data,xmin,xmax,'%.2f',ymin-ticky,ymax+ticky,'%.2e',hsize,vsize,tickx,ticky,None)
    Story.append(a)

    Story.append(PageBreak())
        
    #==============================================================================
    # Argon position
    #==============================================================================

    
    
    #==============================================================================
    # Create PDF report from Story
    #==============================================================================
    print("Create the PDF")
    
    gravi_visual_class.TITLE    = "GRAVITY "+datatype+" Quality Control Report"
    gravi_visual_class.PAGEINFO = datatype+" file: "+filename+".fits"
    reportname = filename+"-DISP.pdf"
    
    doc = SimpleDocTemplate(reportname)
    doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages)

    print((" "+reportname)) 

##==============================================================================
## MAIN PROGRAM    
##==============================================================================

if __name__ == '__main__':
    import sys
    if len(sys.argv) == 2 :
        filename=sys.argv[1]
    
    if filename == '' :
        filename=input(" Enter DISP_MODEL file name (without .fits) : ")

    dark = gravi_visual_class.Dark(filename+'.fits')

    produce_disp_report(disp,filename)
