import os
import pandas as pd
import requests
from datetime import datetime, timedelta
from io import StringIO

# https://apihub.kma.go.kr/ 참고
weather_api_columns = [
    "관측시각",
    "지점번호",
    "풍향",
    "풍속",
    "돌풍향",
    "돌풍속",
    "돌풍속_관측_시각",
    "현지기압",
    "해면기압",
    "기압변화경향",
    "기압변화량",
    "기온",
    "이슬점_온도",
    "상대습도",
    "수증기압",
    "강수량",
    "위_관측시간까지의_일강수량",
    "위_관측시간까지의_일강수량(전문)",
    "강수강도",
    "3시간_신적설",
    "일_신적설",
    "적설",
    "GTS_현재일기",
    "GTS_과거일기",
    "국내식_일기코드",
    "전운량",
    "중하층운량",
    "최저운고",
    "운형",
    "GTS_상층운행",
    "GTS_중층운행",
    "GTS_하층운행",
    "시정",
    "일조",
    "일사",
    "지면상태_코드",
    "지면온도",
    "5cm지중온도",
    "10cm지중온도",
    "20cm지중온도",
    "30cm지중온도",
    "해면상태_코드",
    "파고",
    "Beaufart_최대풍력",
    "강수자료",
    "유인관측/무인관측"
]

def generate_dates(start_date, end_date):
    current_date = datetime.strptime(start_date, '%Y%m%d%H%M')
    end_date = datetime.strptime(end_date, '%Y%m%d%H%M')
    list_of_days = []
    while current_date <= end_date:
        list_of_days.append(current_date.strftime('%Y%m%d%H%M'))
        current_date += timedelta(days=1)
    return list_of_days

def call_administration_of_weather_api(start_date, end_date, stn=281): # 281 == 영천
    headers = {
        'Content-Type': 'application/json'
    }
    # 이거 기상청 api가 조금 많이 이상해서 해더가 실제로 작동하지 아니하고 json 대신 그냥 txt 로 반환됩니다.

    auth = "umD2O5RRRSOg9juUUcUjvw"

    url = (f'https://apihub.kma.go.kr/api/typ01/url/kma_sfctm3.php?'
           f'tm1={start_date}&tm2={end_date}&stn={stn}&authKey={auth}')  # API URL 설정

    response = requests.get(url, headers=headers)  # GET 요청

    return response.text


if __name__ == "__main__":
    start = '202007010000'
    end = '202308010000'
    date_lists = generate_dates(start, end)

    df_weather = pd.DataFrame()
    k = 24
    for i, date in enumerate(range(0, len(date_lists)-1, k)):
        if date+k <= len(date_lists):
            end_day = date+k
        else:
            end_day = len(date_lists) - 1
        text = call_administration_of_weather_api(date_lists[date], date_lists[end_day])
        buffer = StringIO(text)
        df = pd.read_csv(buffer, skiprows=2, skipfooter=1, sep=r"\s+", header=None, index_col=False, engine="python").iloc[2:,:-1]
        df_weather = pd.concat([df_weather, df], ignore_index=True)
        print(f"{i}/{len(range(0, len(date_lists) - 1, k))-1}")

    df_weather = df_weather.set_axis(weather_api_columns, axis=1)
    df_weather.to_csv(f"{start}_{end}.csv", index=False)