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

import odoo
import odoo.tools.config
import odoo.modules.registry
import odoo.api
from datetime import datetime
import csv
from io import StringIO
import sys
import os

def sanitize(text):
    if not text:
        return ''
    return str(text).replace('|', ' ').replace('\n', ' ').strip()

# Config (Optional: override with --config)
CONF_FILE = '/etc/odoo17prod.conf'  
DB_NAME = 'odoo17prod'      
DATE_START = '2025-01-01'
DATE_END = '2025-12-31'
OUTPUT_FILE = '/tmp/93020905100026FEC20250101.fec'
company_id = 1

def main():
    print("Starting FEC export...")

    # Load Odoo configuration
    odoo.tools.config.parse_config([f"--config={CONF_FILE}"])

    # Manually initialize Odoo
    odoo.sql_db.close_all()
    db = odoo.sql_db.db_connect(DB_NAME)
    registry = odoo.modules.registry.Registry(DB_NAME)

    with db.cursor() as cr:
        env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})

        # Get the company
        #company = env['res.company'].search([], limit=1)
        company = env['res.company'].browse(company_id)
        if not company:
            print("No company found.")
            sys.exit(1)

        print(f"Company: {company.name}")
        print(f"Date range: {DATE_START} to {DATE_END}")

        # Fetch account move lines
        move_lines = env['account.move.line'].search([
            ('company_id', '=', company.id),
            ('date', '>=', DATE_START),
            ('date', '<=', DATE_END),
            ('move_id.state', '=', 'posted')
        ], order='date')

        print(f"Found {len(move_lines)} move lines.")

        fec_output = StringIO()
        fec_writer = csv.writer(fec_output, delimiter='|', quoting=csv.QUOTE_MINIMAL)

        fec_writer.writerow([
            'JournalCode', 'JournalLib', 'EcritureNum', 'EcritureDate', 'CompteNum',
            'CompteLib', 'CompAuxNum', 'CompAuxLib', 'PieceRef', 'PieceDate',
            'EcritureLib', 'Debit', 'Credit', 'EcritureLet', 'DateLet',
            'ValidDate', 'MontantDevise', 'Idevise'
        ])

        for line in move_lines:

            if not line.debit and not line.credit:
                continue
            if line.debit > 0 and line.credit > 0:
                continue

            account_code = line.account_id.code or '000000'
            account_name = line.account_id.name or 'N/A'

            debit_str = f"{line.debit:.2f}".replace('.', ',') if line.debit else '0,00'
            credit_str = f"{line.credit:.2f}".replace('.', ',') if line.credit else '0,00'

            fec_writer.writerow([
                sanitize(line.journal_id.code),
                sanitize(line.journal_id.name),
                sanitize(line.move_id.name),
                line.date.strftime('%Y%m%d') if line.date else '',
                sanitize(account_code),
                sanitize(account_name),
                sanitize(line.partner_id.ref or f"Ecriture {line.move_id.partner_id.ref}" if line.move_id.partner_id else ''),
                sanitize(line.partner_id.name or f"Ecriture {line.move_id.partner_id.name}" if line.move_id.partner_id else ''),
                sanitize(line.move_id.ref or line.move_id.name or f"Move-{line.move_id.id}"),
                line.date.strftime('%Y%m%d') if line.date else '',
                sanitize(line.name.strip() if line.name else f"Ecriture {line.move_id.name}"),
                debit_str,
                credit_str,
                str(line.full_reconcile_id.id) if line.full_reconcile_id else '',
                line.full_reconcile_id.create_date.strftime('%Y%m%d') if line.full_reconcile_id and isinstance(line.full_reconcile_id.create_date, datetime) else '',
                line.move_id.date.strftime('%Y%m%d') if line.move_id.date else '',
                '', '',  # MontantDevise, Idevise
            ])

        with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
            f.write(fec_output.getvalue())

        print(f"FEC export complete: {OUTPUT_FILE}")

if __name__ == "__main__":
    main()
