#include "auth.h"


ld
toRadians(ld degree){
    ld one_deg = (M_PI)/180;
    return (one_deg * degree);
}

ld
sq_root(ld value){
    ld err = 1e-10;

    ld ans = 0;
    ld low = 0 , high = 0;

	if(value < 1){
		low = value , high = 1;
	}
	else{
		low = 1 , high = value;
	}

    for(int i = 1 ; i <= 67 ; i++ ){

        ld mid = low + (high - low)/2.0;

        if( mid*mid <= value ){
            ans = mid;
            low = mid + err;
        }
        else{
            high = mid - err;
        }
    }

    return ans;
}

ld
orthodromic_distance(ld stu_lat,ld stu_long,ld teach_lat,ld teach_long){
    stu_lat = toRadians(stu_lat);
    stu_long = toRadians(stu_long);
    teach_lat = toRadians(teach_lat);
    teach_long = toRadians(teach_long);

    ld diff_lat = teach_lat - stu_lat;
    ld diff_long = teach_long - stu_long;

    ld ans = pwr2(sin(diff_lat/2)) +
                cos(stu_lat) * cos(teach_lat) *
                pwr2(sin(diff_long/2));

    ans = 2 * asin(sq_root(ans));


    // Radius of Earth in
    // Kilometers, R = 6371
    // Use R = 3956 for miles
    ld R = 6371;

	//ans in meter...
    ans = ans * R * (ld)1000;
    return ans;
}

ld
altitude_difference(ld teach_alti, ld stu_alti)
{
    ld diff_alti = teach_alti - stu_alti;

    return diff_alti;
}



bool
check_range(ld dist, ld alti){
    //better implementation for future....
    // the 100 needs to be changed to (db.Room.length)
    return dist <= (ld)100 && (alti >= -3 && alti <= 4);
}
