<?php
/**
 * Contract_Controller.php — مدیریت قراردادها
 * سه نوع: خرید ملک | پیمانکاری ساخت | فروش واحد
 */

if ( ! defined( 'ABSPATH' ) ) exit;

class Contract_Controller {

    public static function register_routes(): void {
        $ns = 'acc/v1';
        $p  = 'acc_jwt_check_permission';

        // قراردادها
        register_rest_route($ns, '/contracts', [
            ['methods'=>'GET',  'callback'=>[self::class,'get_contracts'],   'permission_callback'=>$p],
            ['methods'=>'POST', 'callback'=>[self::class,'create_contract'], 'permission_callback'=>$p],
        ]);
        register_rest_route($ns, '/contracts/(?P<id>\d+)', [
            ['methods'=>'GET',    'callback'=>[self::class,'get_contract'],    'permission_callback'=>$p],
            ['methods'=>'PUT',    'callback'=>[self::class,'update_contract'], 'permission_callback'=>$p],
            ['methods'=>'DELETE', 'callback'=>[self::class,'delete_contract'], 'permission_callback'=>$p],
        ]);

        // طرفین
        register_rest_route($ns, '/contracts/(?P<id>\d+)/parties', [
            ['methods'=>'GET',  'callback'=>[self::class,'get_parties'],   'permission_callback'=>$p],
            ['methods'=>'POST', 'callback'=>[self::class,'create_party'],  'permission_callback'=>$p],
        ]);
        register_rest_route($ns, '/contracts/(?P<id>\d+)/parties/(?P<pid>\d+)', [
            ['methods'=>'PUT',    'callback'=>[self::class,'update_party'], 'permission_callback'=>$p],
            ['methods'=>'DELETE', 'callback'=>[self::class,'delete_party'], 'permission_callback'=>$p],
        ]);

        // اقساط / برنامه پرداخت
        register_rest_route($ns, '/contracts/(?P<id>\d+)/payments', [
            ['methods'=>'GET',  'callback'=>[self::class,'get_payments'],   'permission_callback'=>$p],
            ['methods'=>'POST', 'callback'=>[self::class,'create_payment'], 'permission_callback'=>$p],
        ]);
        register_rest_route($ns, '/contracts/(?P<id>\d+)/payments/(?P<pay_id>\d+)', [
            ['methods'=>'PUT',    'callback'=>[self::class,'update_payment'], 'permission_callback'=>$p],
            ['methods'=>'DELETE', 'callback'=>[self::class,'delete_payment'], 'permission_callback'=>$p],
        ]);
        register_rest_route($ns, '/contracts/(?P<id>\d+)/payments/(?P<pay_id>\d+)/pay', [
            'methods'=>'POST', 'callback'=>[self::class,'mark_payment_paid'], 'permission_callback'=>$p,
        ]);

        // داشبورد پرداخت‌های آینده (همه قراردادها)
        register_rest_route($ns, '/contracts/payments/upcoming', [
            'methods'=>'GET', 'callback'=>[self::class,'get_upcoming_payments'], 'permission_callback'=>$p,
        ]);

        // قالب قرارداد مشارکت در ساخت
        register_rest_route($ns, '/contracts/template/partnership-construction', [
            'methods' => 'GET',
            'callback' => [self::class, 'get_partnership_contract_template'],
            'permission_callback' => $p,
        ]);

        // ایجاد قرارداد مشارکت در ساخت از روی پروژه ملک
        register_rest_route($ns, '/contracts/from-melk-project', [
            'methods' => 'POST',
            'callback' => [self::class, 'create_from_melk_project'],
            'permission_callback' => [self::class, 'perm_melk'],
        ]);

        // ایجاد قرارداد مشارکت مستقیم از قالب (بدون نیاز به پروژه ملک)
        register_rest_route($ns, '/contracts/from-template', [
            'methods' => 'POST',
            'callback' => [self::class, 'create_from_template'],
            'permission_callback' => $p,
        ]);
    }

    public static function perm_melk(): bool {
        if ( ! is_user_logged_in() ) return false;
        $uid = acl_current_user_id();
        return acl_user_is_super_admin( $uid ) || acl_user_can( $uid, 'melk.view' );
    }

    /* ══════════════════════════════════════════════════════════
       قراردادها
    ══════════════════════════════════════════════════════════ */
    public static function get_contracts( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $pre    = $wpdb->prefix;
        $wheres = ['1=1'];
        $args   = [];

        if ($v = $req->get_param('type'))   { $wheres[] = 'c.type = %s';   $args[] = sanitize_text_field($v); }
        if ($v = $req->get_param('status')) { $wheres[] = 'c.status = %s'; $args[] = sanitize_text_field($v); }
        if ($v = $req->get_param('parcel_id'))  { $wheres[] = 'c.parcel_id = %d';  $args[] = (int)$v; }
        if ($v = $req->get_param('project_id')) { $wheres[] = 'c.project_id = %d'; $args[] = (int)$v; }
        $uid = acl_current_user_id();
        if ( ! acl_append_scope_where( $uid, 'project', 'c.project_id', $wheres, $args ) ) {
            return new WP_REST_Response( [ 'data' => [], 'total' => 0 ] );
        }
        if ($v = $req->get_param('search'))     {
            $wheres[] = '(c.title LIKE %s OR c.contract_number LIKE %s)';
            $s = '%'.$v.'%'; $args[] = $s; $args[] = $s;
        }

        $where = 'WHERE '.implode(' AND ', $wheres);
        $sql   = "SELECT c.*,
                    (SELECT COUNT(*) FROM {$pre}contract_parties  cp WHERE cp.contract_id = c.id) AS party_count,
                    (SELECT COUNT(*) FROM {$pre}contract_payments py WHERE py.contract_id = c.id AND py.status IN ('pending','overdue')) AS pending_payments,
                    (SELECT MIN(py.due_date) FROM {$pre}contract_payments py WHERE py.contract_id = c.id AND py.status = 'pending') AS next_due,
                    (SELECT GROUP_CONCAT(cp2.name ORDER BY cp2.id SEPARATOR '، ') FROM {$pre}contract_parties cp2 WHERE cp2.contract_id = c.id LIMIT 3) AS party_names
                  FROM {$pre}contracts c
                  {$where}
                  ORDER BY c.updated_at DESC";

        $rows = $args
            ? $wpdb->get_results($wpdb->prepare($sql, ...$args), ARRAY_A)
            : $wpdb->get_results($sql, ARRAY_A);

        return new WP_REST_Response(['data' => $rows ?: [], 'total' => count($rows ?: [])]);
    }

    public static function get_contract( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $pre = $wpdb->prefix;
        $id  = (int)$req->get_param('id');

        $contract = $wpdb->get_row($wpdb->prepare(
            "SELECT c.* FROM {$pre}contracts c WHERE c.id = %d", $id
        ), ARRAY_A);

        if ( ! $contract ) return new WP_REST_Response(['message'=>'قرارداد یافت نشد'], 404);

        $deny = acl_deny_scope( acl_current_user_id(), 'project', $contract['project_id'] ? (int) $contract['project_id'] : null, '' );
        if ( $deny ) return $deny;

        $contract['parties']  = $wpdb->get_results($wpdb->prepare(
            "SELECT * FROM {$pre}contract_parties WHERE contract_id = %d ORDER BY id", $id
        ), ARRAY_A);

        $contract['payments'] = $wpdb->get_results($wpdb->prepare(
            "SELECT * FROM {$pre}contract_payments WHERE contract_id = %d ORDER BY installment_no, due_date", $id
        ), ARRAY_A);

        // بروزرسانی وضعیت اقساط سررسیدگذشته
        self::_auto_update_overdue($id);

        // خلاصه مالی
        $paid    = array_sum(array_column($contract['payments'], 'paid_amount'));
        $pending = array_sum(array_filter(array_column($contract['payments'], 'amount'), function($i) use ($contract) {
            return in_array($contract['payments'][$i]['status'], ['pending','overdue','partial']);
        })) ?: 0;

        $contract['financial_summary'] = [
            'total'        => (float)$contract['total_amount'],
            'paid'         => (float)$contract['paid_amount'],
            'remaining'    => (float)$contract['total_amount'] - (float)$contract['paid_amount'],
            'progress_pct' => $contract['total_amount'] > 0
                ? round((float)$contract['paid_amount'] / (float)$contract['total_amount'] * 100, 1)
                : 0,
        ];

        // لینک پارسل
        if ( $contract['parcel_id'] ) {
            $contract['parcel'] = $wpdb->get_row($wpdb->prepare(
                "SELECT id, code, sub_code, address, district_id FROM {$pre}gis_parcels WHERE id = %d",
                $contract['parcel_id']
            ), ARRAY_A);
        }

        return new WP_REST_Response(['data' => $contract]);
    }

    public static function create_contract( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $pid  = $req->get_param('project_id') ? (int) $req->get_param('project_id') : null;
        $deny = acl_deny_scope( acl_current_user_id(), 'project', $pid, '' );
        if ( $deny ) return $deny;
        $data = [
            'type'            => sanitize_text_field($req->get_param('type')   ?: 'purchase'),
            'status'          => sanitize_text_field($req->get_param('status') ?: 'draft'),
            'title'           => sanitize_text_field($req->get_param('title')  ?: ''),
            'contract_number' => sanitize_text_field($req->get_param('contract_number') ?: ''),
            'contract_date'   => sanitize_text_field($req->get_param('contract_date')   ?: ''),
            'start_date'      => sanitize_text_field($req->get_param('start_date')      ?: ''),
            'end_date'        => sanitize_text_field($req->get_param('end_date')        ?: ''),
            'total_amount'    => (float)($req->get_param('total_amount') ?: 0),
            'currency'        => sanitize_text_field($req->get_param('currency') ?: 'IRR'),
            'parcel_id'       => $req->get_param('parcel_id')  ? (int)$req->get_param('parcel_id')  : null,
            'project_id'      => $req->get_param('project_id') ? (int)$req->get_param('project_id') : null,
            'description'     => sanitize_textarea_field($req->get_param('description') ?: ''),
            'notes'           => sanitize_textarea_field($req->get_param('notes')       ?: ''),
            'created_by_name' => sanitize_text_field($req->get_param('created_by_name') ?: ''),
        ];

        if ( ! $data['title'] ) return new WP_REST_Response(['message'=>'عنوان قرارداد الزامی است'], 400);
        foreach (['contract_date','start_date','end_date'] as $k) {
            if ( empty($data[$k]) ) unset($data[$k]);
        }

        $wpdb->insert($wpdb->prefix.'contracts', $data);
        return new WP_REST_Response(['id'=>$wpdb->insert_id, 'success'=>true], 201);
    }

    public static function update_contract( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $id   = (int)$req->get_param('id');
        $deny = acl_deny_entity_project( acl_current_user_id(), 'contracts', $id );
        if ( $deny ) return $deny;
        $keys = ['type','status','title','contract_number','contract_date','start_date',
                 'end_date','total_amount','currency','parcel_id','project_id','description','notes'];
        $data = [];
        foreach ($keys as $k) {
            $v = $req->get_param($k);
            if ($v === null) continue;
            $data[$k] = in_array($k,['parcel_id','project_id']) ? (int)$v
                      : ($k==='total_amount' ? (float)$v : sanitize_textarea_field((string)$v));
        }
        if ( isset( $data['project_id'] ) ) {
            $deny = acl_deny_scope( acl_current_user_id(), 'project', $data['project_id'] ?: null );
            if ( $deny ) return $deny;
        }
        $wpdb->update($wpdb->prefix.'contracts', $data, ['id'=>$id]);
        return new WP_REST_Response(['success'=>true]);
    }

    public static function delete_contract( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $id = (int) $req->get_param('id');
        $deny = acl_deny_entity_project( acl_current_user_id(), 'contracts', $id );
        if ( $deny ) return $deny;
        // نرم‌حذف: وضعیت terminated
        $wpdb->update($wpdb->prefix.'contracts', ['status'=>'terminated'], ['id'=>$id]);
        return new WP_REST_Response(['success'=>true]);
    }

    /* ══════════════════════════════════════════════════════════
       طرفین قرارداد
    ══════════════════════════════════════════════════════════ */
    public static function get_parties( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $rows = $wpdb->get_results($wpdb->prepare(
            "SELECT * FROM {$wpdb->prefix}contract_parties WHERE contract_id=%d ORDER BY id",
            (int)$req->get_param('id')
        ), ARRAY_A);
        return new WP_REST_Response(['data'=>$rows]);
    }

    public static function create_party( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $data = [
            'contract_id' => (int)$req->get_param('id'),
            'role'        => sanitize_text_field($req->get_param('role')  ?: 'buyer'),
            'name'        => sanitize_text_field($req->get_param('name')  ?: ''),
            'national_id' => sanitize_text_field($req->get_param('national_id') ?: ''),
            'phone'       => sanitize_text_field($req->get_param('phone')       ?: ''),
            'address'     => sanitize_textarea_field($req->get_param('address') ?: ''),
            'is_company'  => $req->get_param('is_company') ? 1 : 0,
            'company_name'=> sanitize_text_field($req->get_param('company_name') ?: ''),
            'company_reg' => sanitize_text_field($req->get_param('company_reg')  ?: ''),
        ];
        if ( ! $data['name'] ) return new WP_REST_Response(['message'=>'نام الزامی است'], 400);
        $wpdb->insert($wpdb->prefix.'contract_parties', $data);
        return new WP_REST_Response(['id'=>$wpdb->insert_id, 'success'=>true], 201);
    }

    public static function update_party( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $data = [];
        foreach (['role','name','national_id','phone','address','company_name','company_reg'] as $k) {
            $v = $req->get_param($k);
            if ($v !== null) $data[$k] = sanitize_textarea_field((string)$v);
        }
        if ($req->get_param('is_company') !== null) $data['is_company'] = $req->get_param('is_company') ? 1 : 0;
        $wpdb->update($wpdb->prefix.'contract_parties', $data, [
            'id'=>(int)$req->get_param('pid'), 'contract_id'=>(int)$req->get_param('id'),
        ]);
        return new WP_REST_Response(['success'=>true]);
    }

    public static function delete_party( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $wpdb->delete($wpdb->prefix.'contract_parties', [
            'id'=>(int)$req->get_param('pid'), 'contract_id'=>(int)$req->get_param('id'),
        ]);
        return new WP_REST_Response(['success'=>true]);
    }

    /* ══════════════════════════════════════════════════════════
       اقساط / برنامه پرداخت
    ══════════════════════════════════════════════════════════ */
    public static function get_payments( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $rows = $wpdb->get_results($wpdb->prepare(
            "SELECT * FROM {$wpdb->prefix}contract_payments WHERE contract_id=%d ORDER BY installment_no, due_date",
            (int)$req->get_param('id')
        ), ARRAY_A);
        return new WP_REST_Response(['data'=>$rows]);
    }

    public static function create_payment( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $pre = $wpdb->prefix;
        $cid = (int)$req->get_param('id');
        $max = (int)($wpdb->get_var($wpdb->prepare(
            "SELECT MAX(installment_no) FROM {$pre}contract_payments WHERE contract_id=%d", $cid
        )) ?: 0);
        $data = [
            'contract_id'    => $cid,
            'installment_no' => $max + 1,
            'description'    => sanitize_text_field($req->get_param('description') ?: ''),
            'amount'         => (float)($req->get_param('amount') ?: 0),
            'due_date'       => sanitize_text_field($req->get_param('due_date') ?: ''),
            'status'         => 'pending',
            'notes'          => sanitize_textarea_field($req->get_param('notes') ?: ''),
        ];
        if (empty($data['due_date'])) unset($data['due_date']);
        $wpdb->insert("{$pre}contract_payments", $data);
        return new WP_REST_Response(['id'=>$wpdb->insert_id, 'success'=>true], 201);
    }

    public static function update_payment( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $data = [];
        foreach (['description','due_date','notes','status'] as $k) {
            $v = $req->get_param($k);
            if ($v !== null) $data[$k] = sanitize_textarea_field((string)$v);
        }
        foreach (['amount','paid_amount'] as $k) {
            $v = $req->get_param($k);
            if ($v !== null) $data[$k] = (float)$v;
        }
        $wpdb->update($wpdb->prefix.'contract_payments', $data, [
            'id'=>(int)$req->get_param('pay_id'), 'contract_id'=>(int)$req->get_param('id'),
        ]);
        self::_sync_paid_amount((int)$req->get_param('id'));
        return new WP_REST_Response(['success'=>true]);
    }

    public static function mark_payment_paid( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $pre    = $wpdb->prefix;
        $cid    = (int)$req->get_param('id');
        $pay_id = (int)$req->get_param('pay_id');
        $pay    = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM {$pre}contract_payments WHERE id=%d AND contract_id=%d", $pay_id, $cid
        ), ARRAY_A);
        if (!$pay) return new WP_REST_Response(['message'=>'قسط یافت نشد'], 404);

        $paid_amount = $req->get_param('paid_amount') ? (float)$req->get_param('paid_amount') : (float)$pay['amount'];
        $paid_date   = sanitize_text_field($req->get_param('paid_date') ?: date('Y-m-d'));
        $status      = $paid_amount >= (float)$pay['amount'] ? 'paid' : 'partial';

        $wpdb->update("{$pre}contract_payments", [
            'paid_amount' => $paid_amount,
            'paid_date'   => $paid_date,
            'status'      => $status,
        ], ['id'=>$pay_id]);

        self::_sync_paid_amount($cid);
        return new WP_REST_Response(['success'=>true, 'status'=>$status]);
    }

    public static function delete_payment( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $cid = (int)$req->get_param('id');
        $wpdb->delete($wpdb->prefix.'contract_payments', [
            'id'=>(int)$req->get_param('pay_id'), 'contract_id'=>$cid,
        ]);
        self::_sync_paid_amount($cid);
        return new WP_REST_Response(['success'=>true]);
    }

    public static function get_upcoming_payments( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $pre  = $wpdb->prefix;
        $days = (int)($req->get_param('days') ?: 60);

        $rows = $wpdb->get_results($wpdb->prepare(
            "SELECT py.*, c.title AS contract_title, c.type AS contract_type,
                    c.contract_number, p.code AS parcel_code
             FROM {$pre}contract_payments py
             JOIN {$pre}contracts c ON c.id = py.contract_id
             LEFT JOIN {$pre}gis_parcels p ON p.id = c.parcel_id
             WHERE py.status IN ('pending','overdue','partial')
               AND c.status = 'active'
             ORDER BY py.due_date ASC
             LIMIT 100",
        ), ARRAY_A);

        // علامت‌گذاری سررسیدگذشته
        $today = date('Y-m-d');
        foreach ($rows as &$r) {
            if ($r['due_date'] && $r['due_date'] < $today && $r['status'] === 'pending') {
                $r['status'] = 'overdue';
                $wpdb->update("{$pre}contract_payments", ['status'=>'overdue'], ['id'=>$r['id']]);
            }
            $r['days_until'] = $r['due_date']
                ? (int)round((strtotime($r['due_date']) - strtotime($today)) / 86400)
                : null;
        }

        return new WP_REST_Response(['data' => $rows]);
    }

    /* ── helpers ─────────────────────────────────────────────── */
    private static function _sync_paid_amount( int $contract_id ): void {
        global $wpdb;
        $pre  = $wpdb->prefix;
        $paid = (float)$wpdb->get_var($wpdb->prepare(
            "SELECT COALESCE(SUM(paid_amount),0) FROM {$pre}contract_payments WHERE contract_id=%d AND status IN ('paid','partial')",
            $contract_id
        ));
        $wpdb->update("{$pre}contracts", ['paid_amount'=>$paid], ['id'=>$contract_id]);
    }

    private static function _auto_update_overdue( int $contract_id ): void {
        global $wpdb;
        $wpdb->query($wpdb->prepare(
            "UPDATE {$wpdb->prefix}contract_payments
             SET status='overdue'
             WHERE contract_id=%d AND status='pending' AND due_date < CURDATE()",
            $contract_id
        ));
    }

    /* ══════════════════════════════════════════════════════════
       قالب قرارداد مشارکت در ساخت
    ══════════════════════════════════════════════════════════ */
    public static function get_partnership_contract_template( WP_REST_Request $req ): WP_REST_Response {
        $owner_name     = sanitize_text_field( $req->get_param('owner_name')       ?? '…………………' );
        $owner_nid      = sanitize_text_field( $req->get_param('owner_nid')        ?? '…………………' );
        $owner_phone    = sanitize_text_field( $req->get_param('owner_phone')      ?? '…………………' );
        $owner_addr     = sanitize_text_field( $req->get_param('owner_address')    ?? '…………………' );
        $cont_name      = sanitize_text_field( $req->get_param('contractor_name')  ?? '…………………' );
        $cont_nid       = sanitize_text_field( $req->get_param('contractor_nid')   ?? '…………………' );
        $cont_phone     = sanitize_text_field( $req->get_param('contractor_phone') ?? '…………………' );
        $cont_addr      = sanitize_text_field( $req->get_param('contractor_address') ?? '…………………' );
        $parcel_desc    = sanitize_text_field( $req->get_param('parcel_description') ?? '…………………' );
        $reno_code      = sanitize_text_field( $req->get_param('renovation_code')  ?? '…………………' );
        $area           = sanitize_text_field( $req->get_param('area_sqm')         ?? '…………………' );
        $floors         = sanitize_text_field( $req->get_param('floors')           ?? '…………………' );
        $owner_pct      = sanitize_text_field( $req->get_param('owner_percent')    ?? '…………………' );
        $cont_pct       = sanitize_text_field( $req->get_param('contractor_percent') ?? '…………………' );
        $duration_mo    = sanitize_text_field( $req->get_param('duration_months')  ?? '…………………' );
        $advance        = sanitize_text_field( $req->get_param('advance_amount')   ?? '…………………' );
        $penalty_daily  = sanitize_text_field( $req->get_param('penalty_daily')    ?? '…………………' );
        $today          = wp_date( 'd/m/Y' );
        $city           = sanitize_text_field( $req->get_param('city')             ?? 'شیراز' );

        $text = self::_build_partnership_text(
            $owner_name, $owner_nid, $owner_phone, $owner_addr,
            $cont_name,  $cont_nid,  $cont_phone,  $cont_addr,
            $parcel_desc, $reno_code, $area, $floors,
            $owner_pct, $cont_pct, $duration_mo, $advance, $penalty_daily,
            $today, $city
        );

        return new WP_REST_Response( [ 'data' => [ 'html' => $text, 'date' => $today ] ] );
    }

    public static function create_from_melk_project( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $pre = $wpdb->prefix;

        $proj_id    = (int) ( $req->get_param('melk_project_id') ?? 0 );
        $owner_name = sanitize_text_field( $req->get_param('owner_name')  ?? '' );
        $cont_name  = sanitize_text_field( $req->get_param('contractor_name') ?? '' );
        $total      = (float) ( $req->get_param('total_amount') ?? 0 );
        $uid        = acl_current_user_id();

        if ( ! $proj_id ) return new WP_REST_Response( ['message' => 'شناسه پروژه الزامی است'], 400 );

        // عنوان خودکار
        $proj = $wpdb->get_row( $wpdb->prepare(
            "SELECT * FROM {$pre}melk_construction_projects WHERE id = %d", $proj_id
        ), ARRAY_A );
        if ( ! $proj ) return new WP_REST_Response( ['message' => 'پروژه یافت نشد'], 404 );

        $title = 'قرارداد مشارکت در ساخت — ' . $proj['title'];
        $u     = get_userdata( $uid );
        $u_name = $u ? ( $u->display_name ?: $u->user_login ) : '';

        // تولید متن قرارداد
        $text = self::_build_partnership_text(
            $owner_name       ?: $u_name,
            $req->get_param('owner_nid')        ?? '…',
            $req->get_param('owner_phone')      ?? '…',
            $req->get_param('owner_address')    ?? '…',
            $cont_name,
            $req->get_param('contractor_nid')   ?? '…',
            $req->get_param('contractor_phone') ?? '…',
            $req->get_param('contractor_address') ?? '…',
            $req->get_param('parcel_description') ?? ( $proj['renovation_code'] ? 'کد نوسازی ' . $proj['renovation_code'] : '…' ),
            $proj['renovation_code'] ?? '…',
            $req->get_param('area_sqm')           ?? ( $proj['area_sqm'] ? (string)$proj['area_sqm'] : '…' ),
            $req->get_param('floors')             ?? '…',
            $req->get_param('owner_percent')      ?? '…',
            $req->get_param('contractor_percent') ?? '…',
            $req->get_param('duration_months')    ?? '…',
            $req->get_param('advance_amount')     ?? '…',
            $req->get_param('penalty_daily')      ?? '…',
            wp_date('d/m/Y'),
            $req->get_param('city') ?? 'شیراز'
        );

        // ثبت قرارداد در ماژول قراردادها
        $wpdb->insert( "{$pre}contracts", [
            'type'             => 'construction',
            'status'           => 'draft',
            'title'            => $title,
            'contract_date'    => current_time('Y-m-d'),
            'total_amount'     => $total,
            'currency'         => 'IRR',
            'description'      => $text,
            'notes'            => 'ایجاد خودکار از پروژه ملک #' . $proj_id,
            'created_by_name'  => $u_name,
        ] );
        $contract_id = (int) $wpdb->insert_id;

        // ثبت طرف مالک
        if ( $owner_name ) {
            $wpdb->insert( "{$pre}contract_parties", [
                'contract_id'  => $contract_id,
                'role'         => 'owner',
                'name'         => $owner_name,
                'national_id'  => $req->get_param('owner_nid') ?? '',
                'phone'        => $req->get_param('owner_phone') ?? '',
                'address'      => $req->get_param('owner_address') ?? '',
            ] );
        }
        // ثبت طرف پیمانکار
        if ( $cont_name ) {
            $wpdb->insert( "{$pre}contract_parties", [
                'contract_id'  => $contract_id,
                'role'         => 'contractor',
                'name'         => $cont_name,
                'national_id'  => $req->get_param('contractor_nid') ?? '',
                'phone'        => $req->get_param('contractor_phone') ?? '',
                'address'      => $req->get_param('contractor_address') ?? '',
            ] );
        }

        return new WP_REST_Response( [
            'success'     => true,
            'contract_id' => $contract_id,
            'html'        => $text,
        ], 201 );
    }

    public static function create_from_template( WP_REST_Request $req ): WP_REST_Response {
        global $wpdb;
        $pre = $wpdb->prefix;
        $uid = acl_current_user_id();
        $u   = get_userdata( $uid );
        $u_name = $u ? ( $u->display_name ?: $u->user_login ) : '';

        $owner_name = sanitize_text_field( $req->get_param('owner_name')         ?? '' );
        $cont_name  = sanitize_text_field( $req->get_param('contractor_name')    ?? '' );
        $total      = (float) ( $req->get_param('total_amount') ?? 0 );
        $title      = sanitize_text_field( $req->get_param('title') ?? '' );
        if ( ! $title ) $title = 'قرارداد مشارکت در ساخت — ' . ( $owner_name ?: $u_name );

        $text = self::_build_partnership_text(
            $owner_name       ?: $u_name,
            $req->get_param('owner_nid')          ?? '…',
            $req->get_param('owner_phone')         ?? '…',
            $req->get_param('owner_address')       ?? '…',
            $cont_name,
            $req->get_param('contractor_nid')      ?? '…',
            $req->get_param('contractor_phone')    ?? '…',
            $req->get_param('contractor_address')  ?? '…',
            $req->get_param('parcel_description')  ?? '…',
            $req->get_param('renovation_code')     ?? '…',
            $req->get_param('area_sqm')            ?? '…',
            $req->get_param('floors')              ?? '…',
            $req->get_param('owner_percent')       ?? '…',
            $req->get_param('contractor_percent')  ?? '…',
            $req->get_param('duration_months')     ?? '…',
            $req->get_param('advance_amount')      ?? '…',
            $req->get_param('penalty_daily')       ?? '…',
            wp_date('d/m/Y'),
            $req->get_param('city') ?? 'شیراز'
        );

        $wpdb->insert( "{$pre}contracts", [
            'type'            => 'construction',
            'status'          => sanitize_text_field( $req->get_param('status') ?? 'draft' ),
            'title'           => $title,
            'contract_date'   => current_time('Y-m-d'),
            'total_amount'    => $total,
            'currency'        => 'IRR',
            'description'     => $text,
            'notes'           => sanitize_textarea_field( $req->get_param('notes') ?? '' ),
            'created_by_name' => $u_name,
        ] );
        $contract_id = (int) $wpdb->insert_id;

        if ( $owner_name ) {
            $wpdb->insert( "{$pre}contract_parties", [
                'contract_id' => $contract_id,
                'role'        => 'owner',
                'name'        => $owner_name,
                'national_id' => $req->get_param('owner_nid')     ?? '',
                'phone'       => $req->get_param('owner_phone')   ?? '',
                'address'     => $req->get_param('owner_address') ?? '',
            ] );
        }
        if ( $cont_name ) {
            $wpdb->insert( "{$pre}contract_parties", [
                'contract_id' => $contract_id,
                'role'        => 'contractor',
                'name'        => $cont_name,
                'national_id' => $req->get_param('contractor_nid')     ?? '',
                'phone'       => $req->get_param('contractor_phone')   ?? '',
                'address'     => $req->get_param('contractor_address') ?? '',
            ] );
        }

        return new WP_REST_Response( [
            'success'     => true,
            'contract_id' => $contract_id,
        ], 201 );
    }

    private static function _build_partnership_text(
        string $owner_name, string $owner_nid, string $owner_phone, string $owner_addr,
        string $cont_name,  string $cont_nid,  string $cont_phone,  string $cont_addr,
        string $parcel_desc, string $reno_code, string $area, string $floors,
        string $owner_pct, string $cont_pct, string $duration_mo, string $advance,
        string $penalty_daily, string $today, string $city
    ): string {
        return <<<HTML
<div dir="rtl" class="melk-contract-body" style="font-family:'IRANSans',Tahoma,sans-serif;font-size:13px;line-height:2;color:#111;max-width:900px;margin:0 auto;padding:32px">

<h2 style="text-align:center;font-size:17px;border-bottom:2px solid #333;padding-bottom:8px;margin-bottom:24px">
  قرارداد مشارکت در ساخت و ساز
</h2>

<p style="text-align:center;color:#555;font-size:12px">این قرارداد بر اساس مواد ۱۰، ۱۸۳ تا ۲۱۹ و ۷۲۳ قانون مدنی جمهوری اسلامی ایران تنظیم می‌شود.</p>
<hr style="margin:16px 0">

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۱ — طرفین قرارداد</h3>
<table style="width:100%;border-collapse:collapse;font-size:13px" border="0">
<tr>
  <td style="width:50%;vertical-align:top;padding-left:12px">
    <strong>طرف اول (مالک / صاحب زمین):</strong><br>
    نام و نام خانوادگی: {$owner_name}<br>
    کدملی: {$owner_nid}<br>
    شماره تماس: {$owner_phone}<br>
    آدرس: {$owner_addr}
  </td>
  <td style="width:50%;vertical-align:top;padding-right:12px">
    <strong>طرف دوم (پیمانکار / سازنده):</strong><br>
    نام و نام خانوادگی: {$cont_name}<br>
    کدملی: {$cont_nid}<br>
    شماره تماس: {$cont_phone}<br>
    آدرس: {$cont_addr}
  </td>
</tr>
</table>

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۲ — موضوع قرارداد</h3>
<p>موضوع این قرارداد مشارکت در احداث ساختمان بر روی ملکی با مشخصات ذیل می‌باشد:</p>
<ul style="margin:8px 0 8px 24px">
  <li>مشخصات ملک: {$parcel_desc}</li>
  <li>کد نوسازی: {$reno_code}</li>
  <li>مساحت عرصه: {$area} مترمربع</li>
  <li>تعداد طبقات مجاز ساخت: {$floors} طبقه</li>
</ul>
<p>طرف اول زمین را تأمین و طرف دوم اجرای کامل عملیات ساختمانی را بر عهده می‌گیرد.</p>

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۳ — حصه و سهم طرفین</h3>
<p>
  <strong>سهم طرف اول (مالک):</strong> {$owner_pct} درصد از کل بنای احداثی<br>
  <strong>سهم طرف دوم (پیمانکار):</strong> {$cont_pct} درصد از کل بنای احداثی
</p>
<p>تقسیم واحدها پس از پایان ساخت و اخذ پروانه پایانکار، با توافق طرفین و از طریق قرعه‌کشی یا تراضی انجام خواهد شد.</p>

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۴ — مدت قرارداد</h3>
<p>مدت اجرای این قرارداد <strong>{$duration_mo} ماه شمسی</strong> از تاریخ اخذ پروانه ساخت است. تمدید مدت صرفاً با توافق کتبی طرفین امکان‌پذیر است.</p>

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۵ — هزینه‌ها و تعهدات مالی</h3>
<ul style="margin:8px 0 8px 24px">
  <li>تمامی هزینه‌های ساخت (مصالح، دستمزد، حمل‌ونقل) بر عهده طرف دوم است.</li>
  <li>هزینه‌های انشعابات آب، برق، گاز و فاضلاب بر عهده طرف دوم است.</li>
  <li>هزینه تهیه نقشه، مهندس ناظر و پروانه ساخت به طور مشترک و به نسبت سهم طرفین است.</li>
  <li>مبلغ پیش‌پرداخت طرف دوم به طرف اول جهت اجاره محل سکونت در طول ساخت: {$advance} تومان</li>
  <li>طرف دوم متعهد می‌شود مبلغ فوق را در تاریخ امضای این قرارداد به طرف اول پرداخت نماید.</li>
</ul>

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۶ — تعهدات طرف اول (مالک)</h3>
<ol style="margin:8px 0 8px 24px">
  <li>تحویل ملک عاری از هرگونه مانع حقوقی و ثبتی به طرف دوم ظرف یک هفته از امضای قرارداد.</li>
  <li>همکاری در اخذ پروانه ساخت و ارائه مدارک مالکیت.</li>
  <li>عدم انتقال ملک یا ایجاد هرگونه حق ثالث بر ملک در طول مدت قرارداد.</li>
  <li>پرداخت عوارض شهرداری مربوط به سهم خود.</li>
</ol>

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۷ — تعهدات طرف دوم (پیمانکار)</h3>
<ol style="margin:8px 0 8px 24px">
  <li>اخذ پروانه ساخت و تأمین کلیه مجوزهای لازم ظرف سه ماه از امضای قرارداد.</li>
  <li>اجرای ساخت منطبق با نقشه‌های مصوب، آیین‌نامه ۲۸۰۰ و مقررات ملی ساختمان.</li>
  <li>استفاده از مصالح استاندارد و تأییدشده.</li>
  <li>رعایت اصول ایمنی کارگاه و مسئولیت حوادث احتمالی.</li>
  <li>تحویل واحدهای سهم طرف اول به صورت کلیدکامل در پایان مدت قرارداد.</li>
  <li>ارائه گزارش پیشرفت ماهیانه به طرف اول.</li>
</ol>

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۸ — ضمانت اجرا و خسارت تأخیر</h3>
<p>در صورت تأخیر طرف دوم در تکمیل پروژه، مبلغ <strong>{$penalty_daily} تومان</strong> به ازای هر روز تأخیر به عنوان خسارت به طرف اول تعلق می‌گیرد. این خسارت از وجوه تضمین یا از سهم طرف دوم قابل کسر است.</p>

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۹ — فسخ قرارداد</h3>
<p>هر یک از طرفین در صورت تخلف طرف دیگر از تعهدات اساسی این قرارداد، پس از ارسال اخطار کتبی و انقضای مهلت ۱۵ روزه، حق فسخ دارد. در صورت فسخ، طرف مقصر ملزم به جبران خسارات وارده است.</p>

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۱۰ — حل اختلاف</h3>
<p>کلیه اختلافات ناشی از تفسیر یا اجرای این قرارداد ابتدا از طریق مذاکره و سپس داوری مرضی‌الطرفین حل و فصل خواهد شد. در صورت عدم توافق، دادگاه صالح {$city} مرجع رسیدگی است.</p>

<h3 style="font-size:14px;margin:16px 0 8px">ماده ۱۱ — نسخه‌های قرارداد</h3>
<p>این قرارداد در <strong>دو نسخه</strong> برابر در تاریخ <strong>{$today}</strong> در {$city} تنظیم و هر نسخه حکم واحد دارد.</p>

<div style="margin-top:48px;display:grid;grid-template-columns:1fr 1fr;gap:40px;text-align:center;font-size:13px">
  <div style="border-top:1px dashed #666;padding-top:12px">
    <strong>طرف اول (مالک)</strong><br>
    {$owner_name}<br><br>
    امضا و اثر انگشت
  </div>
  <div style="border-top:1px dashed #666;padding-top:12px">
    <strong>طرف دوم (پیمانکار)</strong><br>
    {$cont_name}<br><br>
    امضا و اثر انگشت
  </div>
</div>

<div style="margin-top:32px;border:1px dashed #aaa;padding:12px;font-size:12px;color:#666;text-align:center">
  تنظیم‌کننده: سامانه اقتصاد ملک · ACC Engine · {$today}
</div>

</div>
HTML;
    }
}
