#include <stdio.h>
#include <math.h>
#include <stdlib.h>

// Ce programme permet d'estimer t, le paramètre de la fonction des impôts (en fonction du revenu imposable)
// qui dépend des dépenses de l'État et de la répartition des revenus imposables
// Pour tracer la courbe i(r) sur fr.numberempire.com/graphingcalculator.php :  x-10^6+10^(6*1.061152)*0.061152^0.061152*(x+10^6*0.061152)^(-0.061152), x sans revenu de base, x-10^6+10^(6*1.020363)*0.020363^0.020363*(x+10^6*0.020363)^(-0.020363)-7200, x avec
// t est estimé à 0,061152 sans revenu de base, 0,020241 avec, 0,019942 en incluant l'ISF
// tf + th = 3.97.10^10 isf = 4.46.10^9

void main()
{
    double D = (5.32+3.97-0.74+0.046)*pow(10,11); // Les dépenses imposantes de l'État
    double DV = D+2.55*pow(10,11);
    double M = pow(10,6); // Le revenu maximal
    double precision = pow(10,6);

    double i(double r, double t) // La fonction d'impôt en fonction du revenu imposable (et du paramètre qu'on estime)
    {
        double i = r - M*(1-pow((1+r/(M*t)),-t));
        if (i<0) { i=-1; }
        return i;
    }

    double i2(double r, double t) // La fonction d'impôt en fonction du revenu imposable (et du paramètre qu'on estime)
    {
        double i = r - t*log(1+r/t);
        if (i<0) { i=-1; }
        return i;
    }

    double S(double t, int c) // Les recettes de l'impôt, en fonction du paramètre qu'on estime, à partir des données empiriques dtirées de STATA (la fépartition des revenus imposables)
    {
        double revenuImposable, densiteR, fonctionRepartitionR ;
        double S = 0;
        FILE* fichier = NULL;
        fichier = fopen("../Mes_resultats/densite_fonctionRepartition_revenuImposable.txt", "r");
        if (fichier == NULL)
        {
            printf("Impossible d'ouvrir le fichier test.txt");
        }
        else
        {
            while (!feof(fichier))
            {
                fscanf(fichier, "%lf %lf %lf\n", &densiteR, &fonctionRepartitionR, &revenuImposable);

                if (c==1)
                {
                     S += densiteR*i(revenuImposable,t);
                }
                if (c==2)
                {
                    S += densiteR*i2(revenuImposable,t);
                }
            }
        }
        fclose(fichier);
        return S ;
    }

    // estimation du paramètre t, de sorte que les recettes égalent les dépenses (à la précision près)
    double T(double d, int c)
    {
        double D=d;
        double t_ini;
        if (c==1)
        {
             t_ini = pow(10,-1);
        }
        if (c==2)
        {
            t_ini = pow(10,5);
        }
        double t = t_ini ;
        double incr = t_ini/2;

        while (fabs(S(t,c)-D)>precision)
        {
            if (S(t,c)<D)
            {
                t -= incr;
            }
            else
            {
                if (incr==t_ini/2)
                {
                    printf("le t de depart est trop petit");
                    D = S(t,c);
                }
                t += incr;
            }
            incr/=2;
        }
        return t;
    }

    double sPartiel(double m) // Calcule la somme des revenus imposables inférieurs à m
    {
        double revenu, densiteR, fonctionRepartitionR ;
        double S = 0;
        FILE* fichier = NULL;
        fichier = fopen("../Mes_resultats/densite_fonctionRepartition_revenu_hors_alloc_a.txt", "r");
        if (fichier == NULL)
        {
            printf("Impossible d'ouvrir le fichier test.txt");
        }
        else
        {
            while (!feof(fichier))
            {
                fscanf(fichier, "%lf %lf %lf\n", &densiteR, &fonctionRepartitionR, &revenu);
                if (revenu<m)
                {
                    S+=densiteR*revenu;
                }
            }
        }
        fclose(fichier);
        return S ;
    }

    //printf("sPartiel(%lf)=%lf\n",29600.0,sPartiel(29600.0));
    printf("t vaut %lf et D %lf\n",T(D,2),D);
}
