#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
기존 입고 데이터에 입고장 번호를 자동으로 부여하는 스크립트
형식: PR-YYYYMMDD-XXXX (PR: Purchase Receipt)
"""

import sqlite3
from datetime import datetime

def update_receipt_numbers():
    conn = sqlite3.connect('database/kdrug.db')
    cursor = conn.cursor()

    try:
        # 입고장 번호가 없는 레코드 조회
        cursor.execute("""
            SELECT receipt_id, receipt_date, supplier_id
            FROM purchase_receipts
            WHERE receipt_no IS NULL OR receipt_no = ''
            ORDER BY receipt_date, receipt_id
        """)

        receipts = cursor.fetchall()

        if not receipts:
            print("모든 입고장에 이미 번호가 있습니다.")
            return

        print(f"입고장 번호를 부여할 레코드: {len(receipts)}개")

        # 날짜별 카운터 딕셔너리
        date_counters = {}

        for receipt in receipts:
            receipt_id, receipt_date, supplier_id = receipt

            # 날짜 형식 변환
            if receipt_date:
                # receipt_date가 문자열인 경우
                if isinstance(receipt_date, str):
                    date_str = receipt_date.replace('-', '')  # YYYYMMDD 형식
                # receipt_date가 정수인 경우 (YYYYMMDD 형식으로 저장된 경우)
                else:
                    date_str = str(receipt_date)
            else:
                date_str = datetime.now().strftime('%Y%m%d')

            # 해당 날짜의 카운터 증가
            if date_str not in date_counters:
                # 해당 날짜의 기존 최대 번호 확인
                cursor.execute("""
                    SELECT MAX(CAST(SUBSTR(receipt_no, -4) AS INTEGER))
                    FROM purchase_receipts
                    WHERE receipt_no LIKE ?
                """, (f'PR-{date_str}-%',))

                max_num = cursor.fetchone()[0]
                date_counters[date_str] = (max_num or 0) + 1
            else:
                date_counters[date_str] += 1

            # 입고장 번호 생성 (PR-YYYYMMDD-XXXX)
            receipt_no = f"PR-{date_str}-{date_counters[date_str]:04d}"

            # 업데이트
            cursor.execute("""
                UPDATE purchase_receipts
                SET receipt_no = ?
                WHERE receipt_id = ?
            """, (receipt_no, receipt_id))

            print(f"  입고장 ID {receipt_id}: {receipt_no} 부여 완료")

        conn.commit()
        print(f"\n총 {len(receipts)}개의 입고장 번호 부여 완료!")

        # 결과 확인
        cursor.execute("""
            SELECT receipt_id, receipt_no, receipt_date,
                   (SELECT name FROM suppliers WHERE supplier_id = pr.supplier_id) as supplier_name
            FROM purchase_receipts pr
            ORDER BY receipt_date DESC, receipt_id DESC
            LIMIT 10
        """)

        print("\n최근 입고장 목록:")
        print("-" * 80)
        print(f"{'ID':>6} | {'입고장 번호':<20} | {'입고일':<12} | {'공급처'}")
        print("-" * 80)

        for row in cursor.fetchall():
            print(f"{row[0]:>6} | {row[1]:<20} | {row[2]:<12} | {row[3]}")

    except Exception as e:
        print(f"오류 발생: {e}")
        conn.rollback()
    finally:
        conn.close()

if __name__ == "__main__":
    update_receipt_numbers()