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

void Usage(void){
	printf("./command constant-load-watts\n");
	printf("output:\n");
	printf("\tbattery bank Ah needed\n");
	printf("\tpanel wattage needed\n");
}

double Discharge_t(const double d_time, const double ah_cap, const double d_current, const double k){
	double output_time = d_time;
	output_time *= pow(ah_cap/d_current*d_time, k);
	return output_time;
}

int main(int argc, char **argv){
	const double eff_charger = 98;
	const double eff_inverter = 87;
	const double eff_wires = 98;
	const double hours_usefull = 6;
	const double batt_reserve = 210;
	const double batt_min_voltage = 10.5;
	const double batt_bank_voltage = 24;
	//const double
	double kwh_battery = 0;
	double ah_battery = 0;
	double watts_panels = 0;
	double tmp1, tmp2, tmp3;
	double watts_total;
	double watts_load;

	if(argc > 1){
		watts_load = atof(argv[1]);
	}else{
		Usage();
		exit(1);
	}
	//Reserve Capacity At 25 Amps (min): 210 Minute
	//Reserve Capacity At 23 Amps (min): 225 Minute
	//20 Amp Hour Rate (Ah): 105Ah
	//Peukert's law
	// T = H * pow(C/I*H, K);
/*
(Q/Qo)= (T/To)^[(k-1)/k]
Q/Qo= (I/Io)^a , where a=(k-1)/(2-k)

315/210 = (20/25)^a

log(315/210) / log(a) = 20/25

20/25*log(a) = log(315/210)
log(a) = log(315/210)/(20/25)


a = sqrt(log(315/210)/(20/25));

*/

	//calculate battery ah
	ah_battery = 25;
	ah_battery /= batt_reserve/60;
	printf("single battery ah (at 25amp): %lf\n", ah_battery);

	//total kwh neeeded
	//watts_load =
	watts_total = watts_load * 24;
	watts_total /= 1000;
	printf("total kwh needed: %lf\n", watts_total);

	//watts_panels = watts_load * 6;
	//watts_panels /= 1000;
	//watts_panels = watts_total/24;

	watts_panels = watts_total;
	printf("panel kwh needed over 6hrs: %lf\n", watts_panels);


	tmp1 = 300;
	tmp1 -= eff_charger+eff_inverter+eff_wires-100;
	tmp1 /= 100;
	tmp1 *= watts_panels;
	printf("\twith efficiency losses: %lf\n", tmp1);

	//# of panels recommended
	tmp2 = tmp1*1000/6;
	printf("recommended 100w panels: %lf\n", tmp2/100);

	//kwh to ah at (batt_bank_voltage)
//V*A*h = Wh
//watts_load

	tmp2 = tmp1/batt_bank_voltage;
	tmp2 *= 1000;
	tmp3 = 24-6;
	tmp2 /= 24;
	//tmp1 = tmp2;
	tmp2 *= tmp3/24;

	tmp1 = 200;
	tmp1 -= eff_inverter+eff_wires-100;
	tmp1 /= 100;
	tmp1 *= watts_load;
	tmp1 /= batt_bank_voltage;

	tmp3 = Discharge_t((const double)batt_reserve/60, (const double)ah_battery, (const double)(tmp1*batt_bank_voltage/12), 1.25);
	printf("single battery discharge hrs: %lf\n", tmp3);
	printf("single battery ah at this cur: %lf\n", (tmp1*batt_bank_voltage/12)/tmp3);

	printf("recommended # of batteries: %lf\n", (double)(24-6)/tmp3);

	printf("min battery bank ah (at %lfamps): %lf\n", tmp1, tmp2);


	return 0;
}
