#include <qmessagebox.h>
#include <qpaintdevicemetrics.h>
#include <qprinter.h>
#include <qpainter.h>
#include <math.h>

void FormAmmort::imprimer()
{
    QHeader *th = table1->horizontalHeader();
    const int Margin =85;  // marge de gauche
    const int longueur= 505;  // longueur totale du tableau ou abscisse maximale du coint supérieur droit du tableau 
    const int interval=100; // intervalle entre chaque cellule du tableau qui est aussi la taille de la cellule
    int pageNo = 1;
    QPrinter *printer=new QPrinter;
    if ( printer->setup(this) )
    {               // boite de dialogue d'impression
	QPainter p;
	if( !p.begin( printer ) )              // paint on printer
            return;
	p.setFont( table1->font() );
	int yPos=0;                    // y-position for each line
	QFontMetrics fm = p.fontMetrics();
	QPaintDeviceMetrics metrics( printer ); // need width/height
	// impression du titre de la page
	QString titre="TABLEAU D'AMORTISSEMENT D'UN EMPRUNT DE ";
	titre+=lineCapital->text();
	titre+=" EUROS A UN TAUX DE ";
	titre+=lineTx_Interet->text();
	titre+=" % ETALE SUR ";
	titre+=lineDuree->text();
	if (radioButtonAnnuel->isChecked())
	{
	    titre+=" ANNEES :";
	}
	else if (radioButtonMensuel->isChecked())
	{
	    titre+=" MENSUALITES :";
	}
	else
	{
	    // Erreur !
	}
	QFontMetrics fms = fontMetrics();
	int taille;
	taille = fms.width(titre);
	p.drawText((int) (661-taille)/2,0,metrics.width(), fm.lineSpacing(),ExpandTabs | DontClip,titre);
	yPos=yPos+fm.lineSpacing()+20;
	//impression des noms des champs 
	for( int f = 0 ; f < 5 ; f++)
	{
	    if ( Margin + yPos > metrics.height() - Margin )
	    {
		printer->newPage();             // no more room on this page
		yPos = 0;                       // back to top of page
	    }
	    taille = fms.width(th->label(f));
	    p.drawText( Margin-5+f*interval+(int) (interval-taille)/2, yPos+1+(int) fm.lineSpacing()/2,metrics.width(), fm.lineSpacing(),ExpandTabs | DontClip,th->label(f)); // impression du texte au milieu de la cellule
	}
	p.drawLine(Margin-5,yPos+(int) fm.lineSpacing()/2, longueur+Margin-10,yPos+(int) fm.lineSpacing()/2);
	yPos=yPos+fm.lineSpacing();
	
	//impression des chiffres du tableau                                  
	for( int i = 0 ; i < table1->numRows(); i++ ) 
	{
	    for (int k = 0 ; k < 5 ; k++)
	    {
		if (k==0)
		{
		    taille=fms.width(table1->text(i,0));
		    p.drawText( Margin-5+(int) (interval-taille)/2, yPos+1+(int) fm.lineSpacing()/2,metrics.width(), fm.lineSpacing(),ExpandTabs | DontClip,table1->text(i,0) );
		}
		else
		{
		    p.drawText( Margin+k*interval, yPos+1+(int) fm.lineSpacing()/2,metrics.width(), fm.lineSpacing(),ExpandTabs | DontClip,table1->text(i,k) );
		}
	    }
	    p.drawLine(Margin-5,yPos+(int) fm.lineSpacing()/2, longueur+Margin-10,yPos+(int) fm.lineSpacing()/2); // on trace une ligne au dessus du texte
	    yPos = yPos + fm.lineSpacing(); // augmentation de l'ordonné
	}
	// Tracet de la dernière ligne du bas du tableau
	p.drawLine(Margin-5,yPos+(int) fm.lineSpacing()/2, longueur+Margin-10,yPos+(int) fm.lineSpacing()/2);
	
	// boucle pour tracer chaque ligne verticale du tableau
	for (int k=0;k<6;k++)
	{
	    p.drawLine(Margin-5+interval*k,fm.lineSpacing()+20+(int) fm.lineSpacing()/2,Margin-5+interval*k,fm.lineSpacing()+20+fm.lineSpacing()*(table1->numRows()+1)+(int) fm.lineSpacing()/2);
	}
	p.end(); // Envoie du document à l'imprimante
    }
}

void FormAmmort::init()
{
    lineDuree->setText("30");
    lineCapital->setText("100000");
    lineTx_Interet->setText("7");
}

void FormAmmort::GenererTableau()
{
    bool erreur=FALSE;
    // Vérification des données tapées dans le formulaire
    if (lineCapital->text().isEmpty())
    {
	QMessageBox::warning(this,"Montant de l'emprunt incorrect","Vous n'avez rien rentré pour le montant de l'emprunt");
	erreur=TRUE;
    }
    if (lineTx_Interet->text().isEmpty())
    {
	QMessageBox::warning(this,"Taux d'interet incorrect","Vous n'avez rien rentré pour le taux d'interet");
	erreur=TRUE;
    }   
    if (lineDuree->text().isEmpty())
    {
	QMessageBox::warning(this,"Durée de l'emprunt incorrecte","Vous n'avez rien rentré pour la durée de l'emprunt");
	erreur=TRUE;
    }
    if (erreur)
	return;
	
    // Vérification si taux mensuel ou annuel
    double annuite,capital,i,interet,cap_restant,ammort;
    int j,n;
    QHeader *th = table1->horizontalHeader();
    QHeader *tv = table1->verticalHeader();
    n=(lineDuree->text()).toInt(); // récupération de l'année
    capital=(lineCapital->text()).toDouble(); // récupération du montant de l'emprunt
    if (radioButtonAnnuel->isChecked())
    {
	th->setLabel(2,"Annuité");
	i=((lineTx_Interet->text()).toDouble())/100; // récupération du taux d'interet
	annuite=capital*i/(1-pow(1+i, -n)); // cacul de l'annuité
    }
    else if (radioButtonMensuel->isChecked())
    {
	th->setLabel(2,"Mensualité");
	i=lineTx_Interet->text().toDouble()/100; // récupération du taux d'interet
	i=-1+pow(1+i,(double) 1/12);
	annuite=(capital*i/(1-pow(1+i, -n))); // cacul de l'annuité
    }
    else
    {
	// Erreur !
	
    }
    bool ok=TRUE;
    if (!ok)
    {
	QMessageBox::warning(this,"Montant de l'emprunt incorrect","Vous n'avez pas rentré une donnée valide pour le montant de l'emprunt !!");
    }
    
    table1->setNumRows(n); // on défini le nombre de ligne du tableau
    
    QString chaine,period,cap_restant_str;
    chaine.sprintf("%.2f",annuite);
    table1->setText(0,2,chaine);
    cap_restant=capital;
    chaine.sprintf("%.2f",cap_restant);
    table1->setText(0,1,chaine); // affichage du capital dans la 1ère ligne
    for (j=1;j<n+1;j++)
    {
	tv->setLabel(j-1,"");
	period=QString::number(j,10);
	table1->setText(j-1,0,period);
	
	// récupération du capital restant
	cap_restant=table1->text(j-1,1).toDouble();
	
	// affichage de l'annuité
	chaine.sprintf("%.2f",annuite);
	table1->setText(j-1,2,chaine);
	
	// calcul et affichage de l'interet
	interet=cap_restant*i;
	chaine.sprintf("%.2f",interet);
	table1->setText(j-1,3,chaine);
	
	// caulcul et affichage de l'ammortissement
	ammort=annuite-interet;
	chaine.sprintf("%.2f",ammort);
	table1->setText(j-1,4,chaine);
	
	// calcul et affichage du capital restant de l'année suivante
	cap_restant=cap_restant-ammort;
	chaine.sprintf("%.2f",cap_restant);
	table1->setText(j-1,5,chaine);
	if (j!=n)
	{
	    table1->setText(j,1,chaine);
	}
	else
	{
	    table1->setText(j-1,4,table1->text(j-1,1));
	    
	    cap_restant=table1->text(j-1,1).toDouble();
	    ammort=table1->text(j-1,4).toDouble();
	    interet=annuite-ammort;
	    chaine.sprintf("%.2f",interet);
	    table1->setText(j-1,3,chaine);
	    
	    table1->setText(j-1,5,"0");
	}
    }
}


void FormAmmort::changer_etat()
{
    QRadioButton * rb=(QRadioButton*) sender(); // Récupération du bouton
    radioButtonMensuel->setChecked(FALSE);
    radioButtonAnnuel->setChecked(FALSE);
    rb->setChecked(TRUE);
}
