
from flask_restx import Resource, Api, Namespace, fields,reqparse
from flask import request,jsonify
from flask import Flask, request
import os
from haversine import haversine
from database.database import DB
from datetime import datetime
import pandas as pd
import jwt


paths = os.getcwd()

Action = Namespace(
    name="Action",
    description="노드 분석을 위해 사용하는 api.",
)

trip_log_model = Action.model('TripLog', {
    'trip_id': fields.String(required=True, description='The ID of the trip (64 characters)'),
    'trip_distance_m': fields.Float(required=True, description='Total distance traveled in meters'),
    'trip_time_s': fields.Float(required=True, description='Total time of the trip in seconds'),
    'abrupt_start_count': fields.Integer(required=True, description='Count of abrupt starts'),
    'abrupt_stop_count': fields.Integer(required=True, description='Count of abrupt stops'),
    'abrupt_acceleration_count': fields.Integer(required=True, description='Count of abrupt accelerations'),
    'abrupt_deceleration_count': fields.Integer(required=True, description='Count of abrupt decelerations'),
    'helmet_on': fields.Integer(required=True, description='Whether the helmet was worn during the trip, must be 0 or 1 with 1 is the helmet on.'),
    'final_score': fields.Float(required=True, description='The final safety score for the trip')
})


@Action.route('/gps_update')
class fileUpload(Resource):
    def post(self):
        db = DB()
        token = request.headers.get('Authorization')
        if not token:
            return jsonify({'result': 'fail', 'msg': '토큰이 없습니다.'})
        else:
            # Decode the token to verify it
            decoded_token = jwt.decode(token, "secret", algorithms=['HS256'])
            #print(decoded_token)
            user_id = decoded_token['id']
    

        data = request.get_json()
        if len(data["trip_id"]) !=64:
            return jsonify({500 :"ERROR! INVALID TRIP_ID!"})
            
        if len(data["trip_log"]["timestamp"]) == 0:
            return jsonify({500 :"ERROR! 'trip_log' is empty!"})
        
        time_stamp_len = len(data["trip_log"]["timestamp"])
        latitude_len = len(data["trip_log"]["latitude"])
        longitude_len = len(data["trip_log"]["longitude"])
       
        if time_stamp_len != latitude_len or latitude_len != longitude_len:
            return jsonify(
                {
                    500: f"ERROR! Mismatching length of data in trip_log! \n timestamp : {time_stamp_len} \n latitude : {latitude_len} \n longitude : {longitude_len}"
                }
            )
         
        df = pd.DataFrame(data["trip_log"])
        df["user_id"] = data["user_id"]
        df["trip_id"] = data["trip_id"]
        
       	
        columns = df.columns
        data_csv_block = df.to_csv(header=False, index=False)
        print(f"recieved : {data}")
        # GPS 데이터베이스에 삽입
        db.insert_gps_data(data_csv_block, columns)
        return jsonify({'result': f'success'})


@Action.route('/trip_and_score_update')
class fileUpload(Resource):
    def post(self):
        db = DB()
        token = request.headers.get('Authorization')
        if not token:
            return jsonify({'result': 'fail', 'msg': '토큰이 없습니다.'})
        else:
            # Decode the token to verify it
            decoded_token = jwt.decode(token, "secret", algorithms=['HS256'])
            # print(decoded_token)
            user_id = decoded_token['id']

        data = request.get_json()
        if len(data["trip_id"]) != 64:
            return jsonify({500: "ERROR! INVALID TRIP_ID!"})

        if len(data["trip_log"]["timestamp"]) == 0:
            return jsonify({500: "ERROR! 'trip_log' is empty!"})

        trip_id = data["trip_id"]
        trip_distance_m = data["trip_distance_m"]
        trip_time_s = data["trip_time_s"]
        abrupt_start_count = data["abrupt_start_count"]
        abrupt_stop_count = data["abrupt_stop_count"]
        abrupt_acceleration_count = data["abrupt_acceleration_count"]
        abrupt_deceleration_count = data["abrupt_deceleration_count"]
        helmet_on = data["helmet_on"]
        final_score = data["final_score"]

        if not (helmet_on == 1) or (helmet_on == 0):
            return jsonify({500: f"ERROR! INVALID 'helmet_on'! \n helmet_on : {helmet_on}"})

        db.insert_trip_data(
            user_id,
            trip_id,
            trip_distance_m,
            trip_time_s,
            abrupt_start_count,
            abrupt_stop_count,
            abrupt_acceleration_count,
            abrupt_deceleration_count,
            helmet_on,
            final_score
        )
        return jsonify({'result': f'success'})