<?php

namespace Export;

use XBase\Record;
use XBase\WritableTable;

/**
 * Own class for DBF export.
 */
class ExportDataDBF extends ExportData
{
    /**
     * @var WritableTable
     */
    private $table;

    public function initialize()
    {
        global $cfg;

        $this->tempFilename = $cfg['Path']['data'].'export_data.dbf';

        $this->table = WritableTable::create($this->tempFilename, $this->columnDefs(), $this->tempFilename);
    }

    public function finalize()
    {
        $this->sendHttpHeaders();
        $this->table->close();

        readfile($this->tempFilename);
        exit;
    }

    /**
     * @param $order \Order
     */
    public function generateRow($order)
    {
        $row_pointer = $this->table->appendRecord();

        $this->appendToRow($row_pointer, $order);

        $this->table->writeRecord();
    }

    public function sendHttpHeaders()
    {
        header('Content-Type: application/x-dbase; charset='.$this->encoding);
        header('Content-Disposition: attachment; filename="'.$this->filename.'"');
        header('Expires: 0');
        header('Pragma: no-cache');
    }

    protected function columnDefs()
    {
        /* FIXME: dodělat zbytek a přesměrovat DBF z export_sracka sem */
        return [
            ['DATUM_VYST', Record::DBFFIELD_TYPE_DATE], // datum vystavení
            //            ['DATUM_SPL', DBFFIELD_TYPE_DATE], //prázdné
            //            ['DOKLAD_1', DBFFIELD_TYPE_CHAR, 12], //aby tam bylo fčíslo objednávky   např. f11521
            //            ['TYP_ZAP', DBFFIELD_TYPE_CHAR, 1], //hodnota P
            //            ['ZNAK_UCT', DBFFIELD_TYPE_CHAR, 5], //prázdné
            //            ['SYMBOLY', DBFFIELD_TYPE_CHAR, 20], //včísloobjednávky např. v11521
            //            ['PAR_ZNAK', DBFFIELD_TYPE_CHAR, 12], //to samé jako DOKLAD_1 např. f11521
            //            ['BANK_UCET', DBFFIELD_TYPE_CHAR, 44], //prázdné
            //            ['SPEC_SYMB', DBFFIELD_TYPE_CHAR, 10], //prázdné
            //            ['POPIS_TEXT', DBFFIELD_TYPE_CHAR, 30], //libovolný text - např. prodej eshop-objednávka 11521
            //            ['DRUH_UCT', DBFFIELD_TYPE_CHAR, 5], //hodnota  PZ
            //            ['MENA', DBFFIELD_TYPE_CHAR, 3], //buď Kč nebo EUR
            //            ['CELKEM_KC', DBFFIELD_TYPE_NUMERIC, 8, 2], //celková částka dokladu včetně DPH v Kč
            //            ['CELKEMCIZI', DBFFIELD_TYPE_NUMERIC, 8, 2], //celková částka dokladu v EUR - prodej na Slovensko?
            //            ['KURZ', DBFFIELD_TYPE_NUMERIC, 5, 3], //kurz pro přepočet
            //            ['DATUM_DPH', DBFFIELD_TYPE_DATE], //datum DPH = datum vystavení
            //            ['TYP_DPH', DBFFIELD_TYPE_CHAR, 5], //hodnota U
            //            ['ZAKL_DPH_Z', DBFFIELD_TYPE_NUMERIC, 8, 2], //Částka bez daně v základní sazbě
            //            ['DPH_Z', DBFFIELD_TYPE_NUMERIC, 8, 2], //Daň s azba 21 %
            //            ['ZAKL_DPH_S', DBFFIELD_TYPE_NUMERIC, 8, 2], //Částka bez daně ve snížené sazbě
            //            ['DPH_S', DBFFIELD_TYPE_NUMERIC, 8, 2], //Daň s azba 15 %
            //            ['TYPMIMODPH', DBFFIELD_TYPE_CHAR, 1], //prázdné
            //            ['CASTKAMIMO', DBFFIELD_TYPE_NUMERIC, 8, 2], //prázdné
            //            ['STREDISKO', DBFFIELD_TYPE_CHAR, 5], //PRÁZDNÉ
            //            ['vykon', DBFFIELD_TYPE_CHAR, 5], //prázdné
            //            ['zakazka', DBFFIELD_TYPE_CHAR, 5], //prázdné
            //            ['POZNAMKA', DBFFIELD_TYPE_CHAR, 150], //sem naimportovat jméno a příjmění a město kupujícího   JAN NOVAK TURNOV
            //            ['FIRMA', DBFFIELD_TYPE_CHAR, 30], // Firma
            //            ['JMENO', DBFFIELD_TYPE_CHAR, 30], //Jmeno
            //            ['PRIJMENI', DBFFIELD_TYPE_CHAR, 30], //Prijmeni
            //            ['ICO', DBFFIELD_TYPE_CHAR, 15], //ICO
            //            ['DIC', DBFFIELD_TYPE_CHAR, 20], //DIC
            //
            //            ['ZAKAZNIK', DBFFIELD_TYPE_CHAR, 80], //Prijmeni nebo firma
            //            ['ULICE', DBFFIELD_TYPE_CHAR, 50], //Adresa
            //            ['MESTO', DBFFIELD_TYPE_CHAR, 30], //Adresa
            //            ['PSC', DBFFIELD_TYPE_CHAR, 10], //Adresa
            //            ['ZEME', DBFFIELD_TYPE_CHAR, 30], //Adresa
            //
            //            ['STAV', DBFFIELD_TYPE_CHAR, 10], // STORNO/PRODEJ
            //            ['DATUM_SPLAT', DBFFIELD_TYPE_DATE], //datum splatnosti
        ];
    }

    /**
     * @param $row_pointer Record
     * @param $order       \Order
     */
    protected function appendToRow($row_pointer, $order)
    {
        /* FIXME: dodělat zbytek a přesměrovat DBF z export_sracka sem */
        if ($order->date_handle) {
            $row_pointer->setObjectByName('DATUM_VYST', $order->date_handle->format('Ymd')); // datum vystavení
        }
        // $r->setObjectByName("DATUM_SPL", $row['DBFFIELD_TYPE_DATE']); //prázdné
        //        $row_pointer->setObjectByName('DOKLAD_1', $order['order_no']); //aby tam bylo fčíslo objednávky   např. f11521
        //        $row_pointer->setObjectByName('TYP_ZAP', 'P'); //hodnota P
        //        $row_pointer->setObjectByName('ZNAK_UCT', ''); //prázdné
        //        $row_pointer->setObjectByName('SYMBOLY', $order['id']); //včísloobjednávky např. v11521
        //        $row_pointer->setObjectByName('PAR_ZNAK', $order['order_no']); //to samé jako DOKLAD_1 např. f11521
        //        $row_pointer->setObjectByName('BANK_UCET', ''); //prázdné
        //        $row_pointer->setObjectByName('SPEC_SYMB', ''); //prázdné
        //        $row_pointer->setObjectByName('POPIS_TEXT', $encode('Objednávka: ').$order['id']); //libovolný text - např. prodej eshop-objednávka 11521
        //        $row_pointer->setObjectByName('DRUH_UCT', 'PZ'); //hodnota  PZ
        //        $row_pointer->setObjectByName('MENA', $encode('Kč')); //buď Kč nebo EUR
        //        $row_pointer->setObjectByName('CELKEM_KC', $total_price); //celková částka dokladu včetně DPH v Kč
        //        $row_pointer->setObjectByName('CELKEMCIZI', 0); //celková částka dokladu v EUR - prodej na Slovensko?
        //        $row_pointer->setObjectByName('KURZ', 0); //kurz pro přepočet
        //        $row_pointer->setObjectByName('DATUM_DPH', strtotime($order['date_handle'])); //datum DPH = datum vystavení
        //        $row_pointer->setObjectByName('TYP_DPH', 'U'); //hodnota U
        //        $row_pointer->setObjectByName('ZAKL_DPH_Z', $taxes['21']); //Částka bez daně v základní sazbě
        //        $row_pointer->setObjectByName('DPH_Z', $taxes['21']->mul(toDecimal(0.21))); //Daň sazba 21 %
        //        $row_pointer->setObjectByName('ZAKL_DPH_S', $taxes['15']); //Částka bez daně ve snížené sazbě
        //        $row_pointer->setObjectByName('DPH_S', $taxes['15']->mul(toDecimal(0.15))); //Částka bez daně ve snížené sazbě
        //        $row_pointer->setObjectByName('TYPMIMODPH', ''); //prázdné
        //        $row_pointer->setObjectByName('CASTKAMIMO', $taxes['0']); //prázdné
        //        $row_pointer->setObjectByName('STREDISKO', ''); //PRÁZDNÉ
        //        $row_pointer->setObjectByName('vykon', ''); //prázdné
        //        $row_pointer->setObjectByName('zakazka', ''); //prázdné
        //        $row_pointer->setObjectByName('POZNAMKA', "{$order['invoice_name']} {$order['invoice_surname']}, {$order['invoice_city']}"); //sem naimportovat jméno a příjmění a město kupujícího   JAN NOVAK TURNOV
        //        $row_pointer->setObjectByName('FIRMA', $order['invoice_firm']); // Firma
        //        $row_pointer->setObjectByName('JMENO', $order['invoice_name']); //Jmeno
        //        $row_pointer->setObjectByName('PRIJMENI', $order['invoice_surname']); //Prijmeni
        //
        //        $row_pointer->setObjectByName('ICO', $order['invoice_ico']); //ICO
        //        $row_pointer->setObjectByName('DIC', $order['invoice_dic']); //DIC
        //
        //        $row_pointer->setObjectByName('ZAKAZNIK', $order['invoice_firm'] ? $order['invoice_firm'] : "{$order['invoice_name']} {$order['invoice_surname']}"); //Prijmeni nebo firma
        //        $row_pointer->setObjectByName('ULICE', $order['invoice_street']);
        //        $row_pointer->setObjectByName('MESTO', $order['invoice_city']);
        //        $row_pointer->setObjectByName('PSC', $order['invoice_zip']);
        //        $row_pointer->setObjectByName('ZEME', $order['invoice_country']);
        //
        //        $row_pointer->setObjectByName('STAV', $order['status_storno'] ? 'STORNO' : 'PRODEJ'); // STORNO/PRODEJ
        //        $row_pointer->setObjectByName('DATUM_SPLAT', strtotime($order['date_due']));
    }
}
