"""
src/core/gs_sync.py — Zero-Config Smart Sync (Public Link Edition)
------------------------------------------------------------------
Hỗ trợ cực mạnh cho việc nhận diện dữ liệu:
- Pull: Tự tìm cột nào là Ngày, cột nào là Số tiền (Không quan tâm tiêu đề).
- Push: Copy TSV vào Clipboard để dán trực tiếp.
"""
import requests
import re
import io
import csv
from datetime import datetime

def extract_spreadsheet_id(url: str) -> str:
    match = re.search(r"/d/([a-zA-Z0-9-_]+)", url)
    return match.group(1) if match else ""

def get_gid_by_tab_name(spreadsheet_id: str, tab_name: str) -> str:
    """Tự động tìm GID của Tab tháng bằng cách quét HTML."""
    try:
        url = f"https://docs.google.com/spreadsheets/d/{spreadsheet_id}/edit"
        res = requests.get(url, timeout=10)
        if res.status_code != 200: return "0"
        
        # Regex tìm ID của tab (Google Sheets bootstrap data)
        # Kiểu 1: ["name", gid, ...
        pattern1 = rf'"{re.escape(tab_name)}",\s*([0-9]+)'
        match1 = re.search(pattern1, res.text)
        if match1: return match1.group(1)
            
        # Kiểu 2: "id":12345,"name":"02-2026"
        pattern2 = rf'"id":([0-9]+),"name":"{re.escape(tab_name)}"'
        match2 = re.search(pattern2, res.text)
        if match2: return match2.group(1)

        # Kiểu 3: "name":"02-2026","id":12345
        pattern3 = rf'"name":"{re.escape(tab_name)}","id":([0-9]+)'
        match3 = re.search(pattern3, res.text)
        if match3: return match3.group(1)

        return "0" 
    except:
        return "0"

def _smart_parse_date(val: str):
    """Cố gắng đoán ngày từ chuỗi bất kỳ."""
    val = val.strip()
    patterns = [
        "%d/%m/%Y", "%Y-%m-%d", "%d-%m-%Y", "%m/%d/%Y",
        "%d.%m.%Y", "%Y/%m/%d"
    ]
    for p in patterns:
        try:
            return datetime.strptime(val, p).strftime("%Y-%m-%d")
        except: continue
    return None

def _smart_parse_money(val: str):
    """Lấy số từ chuỗi tiền (Đoán định dạng 1.500.000 hoặc 1,500,000)."""
    if not val: return 0
    # Xóa các ký tự không phải số và dấu phân tách
    clean = re.sub(r"[^0-9.,]", "", val)
    if not clean: return 0
    
    # Nếu có cả . và , (ví dụ 1.234,56) -> Bỏ dấu chấm, đổi phẩy thành chấm
    if '.' in clean and ',' in clean:
        clean = clean.replace('.', '').replace(',', '.')
    # Nếu chỉ có dấu chấm và nó ở vị trí phân cách nghìn (ví dụ 1.500.000)
    elif '.' in clean and len(clean.split('.')[-1]) == 3:
        clean = clean.replace('.', '')
    # Nếu chỉ có dấu phẩy và nó ở vị trí phân cách nghìn (ví dụ 1,500,000)
    elif ',' in clean and len(clean.split(',')[-1]) == 3:
        clean = clean.replace(',', '')
    # Cuối cùng đổi phẩy thành chấm cho float
    clean = clean.replace(',', '.')
    
    try:
        return int(float(clean))
    except:
        return 0

def pull_data_from_link(sheet_url: str, tab_name: str) -> dict:
    """Tải dữ liệu từ Google Sheet (Smart Detection)."""
    ss_id = extract_spreadsheet_id(sheet_url)
    if not ss_id:
        return {"success": False, "message": "Link Google Sheet không hợp lệ."}
    
    gid = get_gid_by_tab_name(ss_id, tab_name)
    export_url = f"https://docs.google.com/spreadsheets/d/{ss_id}/export?format=csv&gid={gid}"
    
    try:
        res = requests.get(export_url, timeout=10)
        if res.status_code != 200:
            return {"success": False, "message": "Lỗi kết nối hoặc Sheet chưa để chế độ 'Công khai'."}
        
        f = io.StringIO(res.text)
        reader = csv.reader(f)
        rows = list(reader)
        if not rows: return {"success": True, "newEntries": []}

        # --- SMART DETECTION: Tìm xem cột nào là cái gì ---
        headers = rows[0]
        col_date, col_amount, col_note = -1, -1, -1
        
        # Thử tìm theo tên tiêu đề trước
        for i, h in enumerate(headers):
            h_low = h.lower()
            if any(k in h_low for k in ["ngày", "date"]): col_date = i
            elif any(k in h_low for k in ["tiền", "amount", "vnd", "giá"]): col_amount = i
            elif any(k in h_low for k in ["ghi chú", "note", "nội dung"]): col_note = i

        # Nếu không tìm thấy, quét 5 dòng đầu để đoán
        if col_date == -1 or col_amount == -1:
            for row in rows[1:6]:
                for i, cell in enumerate(row):
                    if col_date == -1 and _smart_parse_date(cell): col_date = i
                    if col_amount == -1 and _smart_parse_money(cell) > 100: col_amount = i

        if col_date == -1 or col_amount == -1:
            return {"success": False, "message": f"Không nhận diện được cột Ngày/Số tiền trong Sheet (Tab {tab_name})."}

        new_entries = []
        for row in rows[1:]:
            if len(row) <= max(col_date, col_amount): continue
            
            d_str = row[col_date]
            a_val = _smart_parse_money(row[col_amount])
            note = row[col_note] if col_note != -1 else ""
            
            clean_date = _smart_parse_date(d_str)
            if clean_date and a_val > 0:
                new_entries.append({
                    "date": clean_date,
                    "amount": a_val,
                    "category": "other",
                    "note": note + " (Từ Sheet)"
                })
                
        return {
            "success": True, 
            "message": f"Đã nhận diện {len(new_entries)} dòng!",
            "newEntries": new_entries
        }
    except Exception as e:
        return {"success": False, "message": f"Lỗi hệ thống: {str(e)}"}

def format_for_clipboard(entries: list) -> str:
    """Định dạng TSV để dán chuẩn vào Excel/Google Sheet."""
    output = io.StringIO()
    writer = csv.writer(output, delimiter='\t')
    for e in entries:
        d_obj = datetime.strptime(e['date'], "%Y-%m-%d")
        writer.writerow([
            d_obj.strftime("%d/%m/%Y"),
            e['amount'],
            "", # Cột Loại (thường bỏ trống khi dán)
            e['note']
        ])
    return output.getvalue()
