import requests
import json
import pymysql
import os
import base64
from datetime import datetime, timedelta

now1 = datetime.now()
print(f"\n--- 재고 동기화 시작: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} ---")

def load_tokens():
    try:
        with open(token_file, "r") as f:
            return json.load(f)
    except:
        return {}


def save_tokens(tokens):
    """새 토큰을 파일에 저장합니다."""
    with open(token_file, "w") as f:
        json.dump(tokens, f, indent=4)
    print("✅ 새 토큰이 파일에 저장되었습니다.")

def refresh_access_token():
    """Refresh Token을 사용하여 새로운 Access Token을 발급받습니다."""
    print("⏳ Access Token 갱신을 시작합니다...")
    tokens = load_tokens()
    refresh_token = tokens.get("refresh_token")
    if not refresh_token:
        print("오류: Refresh Token이 없습니다. 토큰을 재발급 받아야 합니다.")
        return None
    url = f"https://{mallid}.cafe24api.com/api/v2/oauth/token"
    auth_header = base64.b64encode(f"{client_id}:{client_secret}".encode("utf-8")).decode("utf-8")
    headers = {
        'Authorization': f'Basic {auth_header}',
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    payload = {
        "grant_type": "refresh_token",
        "refresh_token": refresh_token
    }
    try:
        response = requests.post(url, headers=headers, data=payload)
        response.raise_for_status()
        new_tokens = response.json()
        # 새 토큰 정보에 만료 시간 계산하여 추가
        expires_in = new_tokens.get("expires_in", 3600)
        new_tokens["expires_at"] = (datetime.utcnow() + timedelta(seconds=expires_in)).strftime("%Y-%m-%dT%H:%M:%S")
        save_tokens(new_tokens)
        return new_tokens
    except requests.exceptions.RequestException as e:
        print(f"오류: 토큰 갱신 중 에러 발생: {e}")
        return None


def api_request(method, url, headers, params=None, json=None):
    """API 요청을 보내고 토큰 만료 시 자동으로 갱신하여 재시도합니다."""
    try:
        response = requests.request(method, url, headers=headers, params=params, json=json)
        if response.status_code == 401:
            print("Access Token이 만료되었습니다. 갱신을 시도합니다.")
            new_tokens = refresh_access_token()
            if new_tokens:
                headers['Authorization'] = f"Bearer {new_tokens['access_token']}"
                print("새로운 토큰으로 API 요청을 재시도합니다.")
                response = requests.request(method, url, headers=headers, params=params, json=json)
            else:
                print("오류: 토큰 갱신에 실패하여 API 요청을 중단합니다.")
                return None
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"API 요청 중 에러 발생: {e}")
        return None



# token_file = "./tokens.json"
# /root bash 실행 때문에 절대경로로 잡아야 한다.


token_file = "/var/www/html/cafe24_stock_update/tokens.json"
mallid = "granceed"
client_id = "ULC335SqJNpocfOXSN1JlH"
client_secret = "VdcQ5RWfEKkDDKPy6TmQkF"
version = "2025-06-01"
tokens = load_tokens()
access_token = tokens["access_token"]

# f"..." (f-string)을 사용하여 변수를 문자열에 올바르게 삽입합니다.
url = f"https://{mallid}.cafe24api.com/api/v2/admin/products"
headers = {
    'Authorization': f"Bearer {access_token}",
    'Content-Type': "application/json",
    'X-Cafe24-Api-Version': version
}

# response = requests.get(url, headers=headers)
response = api_request("GET", url, headers=headers)
# print(response.text)

data = response

product_info_list = [
    {
        'product_no': product.get('product_no'),
        'custom_product_code': product.get('custom_product_code')
    }
    for product in data.get('products', [])
    if product.get('custom_product_code') # custom_product_code가 존재하고, 비어있지 않은 경우에만 포함
]

# >>> product_info_list
# [{'product_no': 98, 'custom_product_code': 'con_통제반영_매입가*1.2'}, {'product_no': 97, 'custom_product_code': 'con_통제반영_매입가*1.2'}]

#이를 조회해서 custom_product_code가 connect인 것만을 조회하여 배열화 하여 전체 작동을 시키는 프로세스로 처리한다.
# custom_product_code가 있는 product_no의 배열을 추출하고 저장한다. 2가지 데이터

# 이제 product_no로 select를 해야한다. 옵션값이 있어야한다.



t = 0
for a in product_info_list:
    product = product_info_list[t]['product_no']
    # 재고 법칙을 추출한다.
    stock_law = product_info_list[t]['custom_product_code'].split('_')[1]
    url = f"https://{mallid}.cafe24api.com/api/v2/admin/products/{product}/variants"
    headers = {
        'Authorization': f"Bearer {access_token}",
        'Content-Type': "application/json",
        'X-Cafe24-Api-Version': f"{version}"
        }
    # response = requests.request("GET", url, headers=headers)
    response = api_request("GET", url, headers=headers)
    data = response
    # data['variants'][0]['variant_code']
    # data['variants'][0]['custom_variant_code']
    requests_list=[]
    i = 0
    for option in data['variants']:
        # con = pymysql.connect(host='host', user='user', password='password', db='db', charset='charset')
        con = pymysql.connect(host='119.205.233.11', user='changgi', password='vkdnjgus13', db='versatile', charset='utf8')
        cur = con.cursor()
        if stock_law == "본사재고반영":
            # print("본사재고반영")
            # sql = "SELECT `inven_1`+`inven_2` FROM `product_table` WHERE `p_suppler_code` = '"+str(data['variants'][0]['custom_variant_code'])+"';"
            sql = "SELECT IFNULL(inven_1, 0) + IFNULL(inven_2, 0) as total_stock FROM `product_table` WHERE `p_suppler_code` = '"+str(data['variants'][i]['custom_variant_code'])+"';"
        elif stock_law == "통제반영":
            # print("통제반영")
            sql = "SELECT IFNULL(inven_1, 0) + IFNULL(inven_7, 0) + IFNULL(inven_2, 0) as total_stock FROM `product_table` WHERE `p_suppler_code` = '"+str(data['variants'][i]['custom_variant_code'])+"';"
        elif stock_law == "사입":
            # print("사입")
            sql = "SELECT IFNULL(inven_2, 0) as total_stock FROM `product_table` WHERE `p_suppler_code` = '"+str(data['variants'][i]['custom_variant_code'])+"';"
        else:
            print("오타_종료 / 자체코드가 없어 조회가 불가능한 경우이거나 stock_law가 엉뚱한 경우에는 그것만 빼고 진행시켜야 합니다.")
        cur.execute(sql)
        rows = cur.fetchone()
        try:
            ws_inven = rows[0]
            if ws_inven is None or ws_inven < 0:
                ws_inven = 0
                ws_inven = int(ws_inven)
            else:
                ws_inven = int(ws_inven)
            quantity = ws_inven
            item_to_add = {
                "variant_code": data['variants'][i]['variant_code'],
                "quantity": quantity
            }
            requests_list.append(item_to_add)
        except TypeError:
            print(str(data['variants'][i]['custom_variant_code'])+"___코드 오류!!_____상품번호: "+str(product))
        i = i + 1
    # Update multiple product variants api로 처리
    url = f"https://{mallid}.cafe24api.com/api/v2/admin/products/{product}/variants"
    payload = {
        "shop_no": 1,
        "requests": requests_list
    }
    headers = {
        'Authorization': f"Bearer {access_token}",
        'Content-Type': "application/json",
        'X-Cafe24-Api-Version': f"{version}"
        }
    # response = requests.request("PUT", url, json=payload, headers=headers)
    response = api_request("PUT", url, headers=headers, json=payload)
    print(str(product)+"___완료")
    t = t+1

print(f"--- 재고 동기화 종료: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} ---\n")
now2 = datetime.now()
now3 = now2 - now1
print(f"--- 가동시간: {now3} ---\n")
