# -*- coding: utf-8 -*-
"""HLQT — công cụ gửi ca từ dòng lệnh (đăng nhập + nạp bản màu + nộp quy trình thực tế + xác nhận ghi).
Dùng: python gui_ca.py tao --anh <đường dẫn> --ma-mau "PT-002 H" --he-son "nước" --nen "tràm bắn cát" [--yeu-cau ...] [--nguoi ...] [--ghi-chu ...]
       python gui_ca.py thuc-te --ca 1 --file <đường dẫn txt|md>
       python gui_ca.py ghi --ca 1 [--pass 19842026]
       python gui_ca.py xem --ca 1
"""
import argparse, os, re, sys, urllib.request, urllib.parse, http.cookiejar, mimetypes, uuid, json, time

GOC = r'C:\Claw 2\Nghien cuu\Du-an-A-Quy-trinh-son'
APP = os.path.join(GOC, 'HLQT-app')


def mat_khau():
    return open(os.path.join(APP, 'mat_khau.txt'), encoding='utf-8').read().strip()


def pass_ghi():
    return open(os.path.join(APP, 'pass_hlqt.txt'), encoding='utf-8').read().strip()


class Khach(object):
    def __init__(self, goc='http://127.0.0.1:8100'):
        self.goc = goc
        self.cj = http.cookiejar.CookieJar()
        self.op = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(self.cj), NoRedirect())

    def mo(self, duong, data=None, kieu=None, method=None):
        req = urllib.request.Request(self.goc + duong, data=data, method=method)
        if kieu:
            req.add_header('Content-Type', kieu)
        try:
            r = self.op.open(req, timeout=120)
            return r.status, r.read().decode('utf-8', 'replace'), dict(r.headers)
        except urllib.error.HTTPError as e:
            return e.code, e.read().decode('utf-8', 'replace'), dict(e.headers)

    def dang_nhap(self):
        d = urllib.parse.urlencode({'mat_khau': mat_khau()}).encode()
        ma, _, _ = self.mo('/dang-nhap', d, 'application/x-www-form-urlencoded')
        return any(c.name == 'ahlqt' for c in self.cj)

    def multipart(self, fields, files):
        b = '----hlqt' + uuid.uuid4().hex
        out = []
        for k, v in fields.items():
            out.append(('--%s\r\nContent-Disposition: form-data; name="%s"\r\n\r\n%s\r\n' % (b, k, v)).encode('utf-8'))
        for k, (ten, duong) in files.items():
            if not duong:
                continue
            out.append(('--%s\r\nContent-Disposition: form-data; name="%s"; filename="%s"\r\n'
                        'Content-Type: %s\r\n\r\n' % (b, k, os.path.basename(ten), mimetypes.guess_type(ten)[0] or 'application/octet-stream')).encode('utf-8'))
            out.append(open(duong, 'rb').read() + b'\r\n')
        out.append(('--%s--\r\n' % b).encode())
        return b''.join(out), 'multipart/form-data; boundary=%s' % b

    def post_multipart(self, duong, fields, files):
        data, kieu = self.multipart(fields, files)
        return self.mo(duong, data, kieu)


class NoRedirect(urllib.request.HTTPRedirectHandler):
    def redirect_request(self, *a, **k):
        return None


def ca_id_tu(loc):
    m = re.search(r'id=(\d+)', loc or '')
    return int(m.group(1)) if m else None


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument('viec', choices=['tao', 'thuc-te', 'ghi', 'xem'])
    ap.add_argument('--anh'); ap.add_argument('--anh-phu', nargs='*')
    ap.add_argument('--ma-mau', default=''); ap.add_argument('--he-son', default='')
    ap.add_argument('--nen', default=''); ap.add_argument('--yeu-cau', default='')
    ap.add_argument('--ghi-chu', default=''); ap.add_argument('--nguoi', default='Lab (kiểm thử)')
    ap.add_argument('--ca', type=int); ap.add_argument('--file'); ap.add_argument('--mat-khau')
    a = ap.parse_args()

    k = Khach()
    if not k.dang_nhap():
        print('LỖI: không đăng nhập được'); return 1

    if a.viec == 'tao':
        files = {'anh': (a.anh, a.anh)} if a.anh else {}
        for i, p in enumerate(a.anh_phu or []):
            files['anh_phu'] = (p, p)
        ma, nd, hd = k.post_multipart('/tao-ca', {'ma_mau': a.ma_mau, 'he_son': a.he_son, 'loai_nen': a.nen,
                                                  'yeu_cau': a.yeu_cau, 'ghi_chu': a.ghi_chu, 'nguoi_nhap': a.nguoi}, files)
        cid = ca_id_tu(hd.get('Location'))
        print('ĐÃ TẠO CA #%s (HTTP %s) → %s' % (cid, ma, hd.get('Location')))
        return 0

    if a.viec == 'thuc-te':
        txt = open(a.file, encoding='utf-8').read()
        ma, nd, hd = k.post_multipart('/nop-thuc-te?id=%d' % a.ca, {'thuc_te': txt}, {})
        print('ĐÃ NỘP QUY TRÌNH THỰC TẾ cho ca #%s (%d ký tự) → %s' % (a.ca, len(txt), hd.get('Location')))
        return 0

    if a.viec == 'ghi':
        ma, nd, hd = k.post_multipart('/ghi?id=%d' % a.ca, {'mat_khau': a.mat_khau or pass_ghi()}, {})
        print('XÁC NHẬN GHI ca #%s → %s' % (a.ca, hd.get('Location')))
        return 0

    if a.viec == 'xem':
        ma, nd, _ = k.mo('/ca?id=%d' % a.ca)
        print('HTTP', ma, '| %d ký tự' % len(nd))
        for tu in ('Quy trình ĐƯỢC ĐỀ NGHỊ', 'ĐỀ XUẤT GHI VÀO CSDL A', 'Đã bổ sung CSDL A'):
            print('  có "%s": %s' % (tu, tu in nd))
        return 0


if __name__ == '__main__':
    sys.exit(main())
