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

complexe complexe_addition(complexe nombre1, complexe nombre2)
{
    complexe resultat;

    resultat.reelle = nombre1.reelle + nombre2.reelle;
    resultat.imaginr = nombre1.imaginr + nombre2.imaginr;

    return resultat;
}

complexe complexe_soustraction(complexe nombre1, complexe nombre2)
{
    complexe resultat;

    resultat.reelle = nombre1.reelle - nombre2.reelle;
    resultat.imaginr = nombre1.imaginr - nombre2.imaginr;

    return resultat;
}

complexe complexe_multiplication (complexe nombre1, complexe nombre2)
{
    double a;
    double b;
    double c;
    double d;

    complexe resultat;

    a = nombre1.reelle;
    b = nombre1.imaginr;
    c = nombre2.reelle;
    d = nombre2.imaginr;

    resultat.reelle = a * c - b * d;
    resultat.imaginr = a * d + b * c;

    return resultat;
}

complexe complexe_division(complexe nombre1, complexe nombre2)
{
    double a;
    double b;
    double c;
    double d;

    complexe resultat;

    a = nombre1.reelle;
    b = nombre1.imaginr;
    c = nombre2.reelle;
    d = nombre2.imaginr;

    if ((c == 0) && (d == 0))
    {
        printf("Division par 0, impossible");
    }

    if (abs(d) <= abs(c))
    {
        resultat.reelle = (a + b * (d/c))/(c + d * (d/c));
        resultat.imaginr = (b - a * (d/c))/(c + d * (d/c));
    }

    else if (abs(d) > abs(c))
    {
        resultat.reelle = (a * (c/d) + b)/(c * (c/d) + d);
        resultat.imaginr = (b * (c/d) - a)/(c * (c/d) + d);
    }

    return resultat;
}

complexe complexe_conjugaison (complexe nombre1)
{
    complexe conjugue;

    conjugue.reelle = nombre1.reelle;
    conjugue.imaginr = (-1) * nombre1.imaginr;

    return conjugue;
}

void complexe_comparaison (complexe nombre1, complexe nombre2)
{
    double compare1;
    double compare2;

    compare1 = nombre1.reelle - nombre2.reelle;
    compare2 = nombre1.imaginr - nombre2.imaginr;

    if (compare1 > 0)
    {
        printf("La partie reelle du complexe 1 est plus grande que celle du complexe 2 \n");
    }

    else if (compare1 < 0)
    {
        printf("La partie reelle du complexe 2 est plus grande que celle du complexe 1 \n");
    }

    else
    {
        printf("La partie reelle du complexe 2 est egale a celle du complexe 1 \n");
    }

    if (compare2 > 0)
    {
        printf("La partie imaginaire du complexe 1 est plus grande que celle du complexe 2 \n");
    }

    else if (compare2 < 0)
    {
        printf("La partie imaginaire du complexe 2 est plus grande que celle du complexe 1 \n");
    }

    else
    {
        printf("La partie imaginaire du complexe 2 est egale a celle du complexe 1 \n");
    }
}

double complexe_module(complexe nombre1)
{
    double module;

    module = powf(nombre1.reelle,2) + powf(nombre1.imaginr,2);
    module = powf(module, 0.5);

    return module;
}

double complexe_partie_reelle(complexe nombre1)
{
    double partie_reelle;

    partie_reelle = nombre1.reelle;

    return partie_reelle;
}

double complexe_partie_imaginaire(complexe nombre1)
{
    double partie_imaginr;

    partie_imaginr = nombre1.imaginr;

    return partie_imaginr;
}

double complexe_argument (complexe nombre1)
{
    complexe argument;
    double argument1;
    complexe tmp;
    double tmp1;

    argument = complexe_soustraction(nombre1, complexe_conjugaison(nombre1));
    argument1 = complexe_partie_imaginaire(argument);
    tmp = complexe_addition(nombre1, complexe_conjugaison(nombre1));
    tmp1 = complexe_partie_reelle(tmp);

    argument1 = atan(argument1/tmp1);

    argument1 = 180 * argument1 / M_PI;

    return argument1;
}
