import tempfile
import unittest
import zipfile
from pathlib import Path
from openpyxl import load_workbook
from compare import run
from delivery import build, BASE, TAIL
from example import create


class DeliveryTests(unittest.TestCase):
    def setUp(self):
        self.tmp=tempfile.TemporaryDirectory();self.addCleanup(self.tmp.cleanup)
        self.root=Path(self.tmp.name);self.inputs=self.root/'inputs';self.config=create(self.inputs)
        self.source=self.root/'engine';run(self.config,self.inputs,self.source)
    def test_result_only_zip_and_item_master(self):
        out=self.root/'delivered';result=build(self.source,out,'sample')
        self.assertEqual((result['categories'],result['items'],result['files']),(2,9,4))
        with zipfile.ZipFile(result['zip']) as z:
            self.assertTrue(all(n.endswith('.xlsx') for n in z.namelist()))
            self.assertFalse(any('确认' in n or '说明' in n or 'coverage' in n for n in z.namelist()))
        wb=load_workbook(result['master'],data_only=True);rows=list(wb.active.values)
        self.assertEqual(rows[0][-1],'类别');self.assertEqual(list(rows[0][:11]),BASE)
        missing=next(r for r in rows[1:] if r[0]=='测试品4');self.assertIsNone(missing[6]);self.assertEqual(missing[3],'示例甲')
        self.assertEqual(wb.active.column_dimensions['A'].width,34)
        self.assertEqual(wb.active['A1'].fill.fgColor.rgb,'FFD9E2F3')
        self.assertEqual(wb.active.freeze_panes,'A2')
        self.assertFalse(wb.active.sheet_view.showGridLines)
        f=load_workbook(result['master'],data_only=False)
        self.assertEqual(f.active['G2'].data_type,'f');self.assertEqual(f.active['J2'].data_type,'f')
        stats=load_workbook(out/'蔬菜.xlsx')['最低价统计']
        self.assertEqual(stats['A1'].value,'类别');self.assertEqual(stats['A7'].value,'供应商');self.assertEqual(stats.freeze_panes,'A8')
    def test_existing_standard_files_are_byte_preserved(self):
        first=self.root/'first';build(self.source,first)
        second=self.root/'second';result=build(first,second)
        self.assertTrue(result['original_standard_files_unchanged'])
        for name in ('蔬菜.xlsx','猪肉.xlsx','分类最低价最多供应商汇总.xlsx'):
            self.assertEqual((first/name).read_bytes(),(second/name).read_bytes())
    def test_duplicate_existing_result_rows_are_preserved(self):
        p=self.source/'猪肉.xlsx';w=load_workbook(p);ws=w['比较结果'];ws.append([c.value for c in ws[2]]);w.save(p)
        result=build(self.source,self.root/'duplicates')
        self.assertEqual(result['items'],10)
        rows=list(load_workbook(result['master'],data_only=True).active.values)
        self.assertEqual(sum(r[0]=='测试猪肉' for r in rows[1:]),2)
    def test_changed_supplier_or_wrong_final_rejected(self):
        p=self.source/'蔬菜.xlsx';w=load_workbook(p);w['比较结果']['G2']=999;w.save(p)
        with self.assertRaisesRegex(ValueError,'final price mismatch'):build(self.source,self.root/'wrong')

if __name__=='__main__':unittest.main(verbosity=2)
