<?php

namespace includes\views;

use includes\wetail\admin\WTV_Settings;
use WC_Tax;
use WC_Countries;
use includes\WTV_Plugin;
use includes\utils\WTV_Utils;
use includes\WTV_Settings_Validator;

class WTV_Accounting_Settings_View{

	const TAB = 'accounting';
    /**
     * Adds all required setting fields for Accounting View
     */
    public static function render_settings()
    {
        $page = "visma";
	    $country_settings = WTV_Settings_Validator::get_country_settings();
	    $tax_settings = WTV_Settings_Validator::get_tax_settings();
	    $valid = 'create_orders' === get_option( 'visma_sync_order_method' ) || WTV_Settings_Validator::accounting_settings_are_valid();

        // Automation settings tab
        WTV_Settings::add_tab( [
            'page' => $page,
            'name' => "accounting",
            'title' => __( "Bokföring", WTV_Plugin::TEXTDOMAIN )
        ], $valid );

	    // Accounting section
	    WTV_Settings::add_section( [
		    'page' => $page,
		    'tab' => "accounting",
		    'name' => "accounting_order",
		    'title' => __( "Artikelkonteringar", WTV_Plugin::TEXTDOMAIN ),
		    'description' => __( 'Artikelkonteringar för olika momssatser. Dessa artikelkonteringar används när man valt att skapa en order i Visma av en order i webshoppen. Anger man ingen artikelkontering letar integrationen upp en default.
		    Artikelkonteringar har hämtats från Visma. Momsatser och länder har hämtats från WooCommerce momsinställningar.', WTV_Plugin::TEXTDOMAIN ),
	    ] );

	    if ( class_exists( 'WC_Tax' ) ) {

		    $tax_classes = WC_Tax::get_tax_classes();

		    // Add the "standard" tax class to the list since it's not included in the get_tax_classes() method
		    array_unshift( $tax_classes, 'standard' );

		    // Loop through each tax class and retrieve the rates
		    foreach ( $tax_classes as $tax_class ) {
			    // Get tax rates for each tax class
			    $tax_rates = WC_Tax::get_rates_for_tax_class( $tax_class );

			    // Skip if there are no rates for the current tax class
			    if ( empty( $tax_rates ) ) {
				    continue;
			    }

			    foreach ( $tax_rates as $rate_id => $tax_rate ) {

					$country =  empty( $tax_rate->tax_rate_country ) ? __('alla länder',  WTV_Plugin::TEXTDOMAIN ) : self::get_country_name_from_abbr( $tax_rate->tax_rate_country );
					$country_code =  empty( $tax_rate->tax_rate_country ) ? __('all',  WTV_Plugin::TEXTDOMAIN ) : strtolower( $tax_rate->tax_rate_country );
				    WTV_Settings::add_field( [
					    'page'    => $page,
					    'tab'     => "accounting",
					    'section' => "accounting_order",
					    'name'    => sprintf( "visma_account_coding_%d_%s", intval( $tax_rate->tax_rate ), $country_code ),
					    'title'   => __( "Artikelkontering som används för försäljning med " . intval( $tax_rate->tax_rate ) . "% moms, " . $country, WTV_Plugin::TEXTDOMAIN ),
					    'type'    => "dropdown",
					    'options' => self::get_account_codings(),
					    'tooltip' => __( "Välj den artikelkontering du vill att ordern ska skall användas för försäljning med  " . intval( $tax_rate->tax_rate ) . "% moms" . $country, WTV_Plugin::TEXTDOMAIN ),
				    ], true );
			    }
		    }
	    }

	    // Accounting section
	    WTV_Settings::add_section( [
		    'page' => $page,
		    'tab' => "accounting",
		    'name' => "accounting_voucher",
		    'title' => __( "Momskonton för verifikationsflöde", WTV_Plugin::TEXTDOMAIN ),
		    'description' => __( 'Konton för olika momssatser. Dessa konton används när man valt att skapa en verfikation av en order i webshoppen', WTV_Plugin::TEXTDOMAIN ),
	    ] );

	    WTV_Settings::add_field( [
		    'page' => $page,
		    'tab' => self::TAB,
		    'section' => 'accounting_voucher',
		    'name' => 'visma_domestic_vat_25_account',
		    'type' => 'number',
		    'min' => '1',
		    'max' => '9999',
		    'title' => __( 'Konto, utgående moms 25% Sverige', WTV_Plugin::TEXTDOMAIN ),
		    'tooltip' => __( 'Kontot för produkter med 25% moms i Sverige', WTV_Plugin::TEXTDOMAIN ),
	    ], WTV_Utils::setting_needed( 'visma_domestic_vat_25_account', $country_settings['sells_to_se'] && $tax_settings['25'] ) );

	    WTV_Settings::add_field( [
		    'page' => $page,
		    'tab' => self::TAB,
		    'section' => 'accounting_voucher',
		    'name' => 'visma_domestic_vat_12_account',
		    'type' => 'number',
		    'min' => '1',
		    'max' => '9999',
		    'title' => __( 'Konto, utgående moms 12% Sverige', WTV_Plugin::TEXTDOMAIN ),
		    'tooltip' => __( 'Kontot för produkter med 12% moms i Sverige', WTV_Plugin::TEXTDOMAIN ),
	    ], WTV_Utils::setting_needed( 'visma_domestic_vat_12_account', $country_settings['sells_to_se'] && $tax_settings['12'] ) );

	    WTV_Settings::add_field( [
		    'page' => $page,
		    'tab' => self::TAB,
		    'section' => 'accounting_voucher',
		    'name' => 'visma_domestic_vat_6_account',
		    'type' => 'number',
		    'min' => '1',
		    'max' => '9999',
		    'title' => __( 'Konto, utgående moms 6% Sverige', WTV_Plugin::TEXTDOMAIN ),
		    'tooltip' => __( 'Kontot för produkter med 6% moms i Sverige', WTV_Plugin::TEXTDOMAIN ),
	    ], WTV_Utils::setting_needed( 'visma_domestic_vat_6_account', $country_settings['sells_to_se'] && $tax_settings['6'] ) );

	    WTV_Settings::add_field( [
		    'page' => $page,
		    'tab' => self::TAB,
		    'section' => 'accounting_voucher',
		    'name' => 'visma_eu_vat_25_account',
		    'type' => 'number',
		    'min' => '1',
		    'max' => '9999',
		    'title' => __( 'Konto, utgående moms 25% EU', WTV_Plugin::TEXTDOMAIN ),
		    'tooltip' => __( 'Kontot för produkter med 25% moms i EU', WTV_Plugin::TEXTDOMAIN ),
	    ], WTV_Utils::setting_needed( 'visma_eu_vat_25_account', $country_settings['sells_to_eu'] && $tax_settings['25'] ) );

	    WTV_Settings::add_field( [
		    'page' => $page,
		    'tab' => self::TAB,
		    'section' => 'accounting_voucher',
		    'name' => 'visma_eu_vat_12_account',
		    'type' => 'number',
		    'min' => '1',
		    'max' => '9999',
		    'title' => __( 'Konto, utgående moms 12% EU', WTV_Plugin::TEXTDOMAIN ),
		    'tooltip' => __( 'Kontot för produkter med 12% moms i EU', WTV_Plugin::TEXTDOMAIN ),
	    ], WTV_Utils::setting_needed( 'visma_eu_vat_12_account', $country_settings['sells_to_eu'] && $tax_settings['12'] ) );

	    WTV_Settings::add_field( [
		    'page' => $page,
		    'tab' => self::TAB,
		    'section' => 'accounting_voucher',
		    'name' => 'visma_eu_vat_6_account',
		    'type' => 'number',
		    'min' => '1',
		    'max' => '9999',
		    'title' => __( 'Konto, utgående moms 6% EU', WTV_Plugin::TEXTDOMAIN ),
		    'tooltip' => __( 'Kontot för produkter med 6% moms i EU', WTV_Plugin::TEXTDOMAIN ),
	    ], WTV_Utils::setting_needed( 'visma_eu_vat_6_account', $country_settings['sells_to_eu'] && $tax_settings['6'] ) );

		if ( get_option( 'visma_sync_order_method' ) == 'create_vouchers') {
			// Shipping section
			WTV_Settings::add_section( [
				'page' => $page,
				'tab' => self::TAB,
				'name' => 'shipping_accounts',
				'title' => __( 'Fraktkonton', WTV_Plugin::TEXTDOMAIN ),
				'description' => __( 'Konton för olika fraktkonton.', WTV_Plugin::TEXTDOMAIN )
			] );

			WTV_Settings::add_field( [
				'page' => $page,
				'tab' => self::TAB,
				'section' => 'shipping_accounts',
				'name' => 'visma_shipping_account_se',
				'type' => 'number',
				'min' => '1',
				'max' => '9999',
				'title' => __( 'Konto för frakt inom Sverige', WTV_Plugin::TEXTDOMAIN ),
				'description' => $country_settings['sells_to_se'] ? self::get_description( 'visma_shipping_account_se' ) : '',
			], WTV_Utils::setting_needed( 'visma_shipping_account_se', $country_settings['sells_to_se'] ) );

			WTV_Settings::add_field( [
				'page' => $page,
				'tab' => self::TAB,
				'section' => 'shipping_accounts',
				'name' => 'visma_shipping_account_eu',
				'type' => 'number',
				'min' => '1',
				'max' => '9999',
				'title' => __( 'Konto för frakt, EU', WTV_Plugin::TEXTDOMAIN ),
				'description' => $country_settings['sells_to_eu'] ? self::get_description( 'visma_shipping_account_eu' ) : '',
			], WTV_Utils::setting_needed( 'visma_shipping_account_eu', $country_settings['sells_to_eu'] ) );

			WTV_Settings::add_field( [
				'page' => $page,
				'tab' => self::TAB,
				'section' => 'shipping_accounts',
				'name' => 'visma_shipping_account_world',
				'type' => 'number',
				'min' => '1',
				'max' => '9999',
				'title' => __( 'Konto för frakt, världen', WTV_Plugin::TEXTDOMAIN ),
				'description' => $country_settings['sells_to_world'] ? self::get_description( 'visma_shipping_account_world' ) : '',
			], WTV_Utils::setting_needed( 'visma_shipping_account_world', $country_settings['sells_to_world'] ) );
		}
    }

	/**
	 * @param $option
	 * @return string
	 */
	public static function get_description( $option ){
		$descriptions = array(
			'visma_shipping_account_se'     => __( 'I dina inställningar ser vi att du levererar till Sverige, detta bokföringskonto behövs då. Vanligt fraktkonto är 3520.', WTV_Plugin::TEXTDOMAIN ),
			'visma_shipping_account_eu'     => __( 'I dina inställningar ser vi att du levererar till EU, detta bokföringskonto behövs då. Vanligt fraktkonto är 3521.', WTV_Plugin::TEXTDOMAIN ),
			'visma_shipping_account_world'  => __( 'I dina inställningar ser vi att du levererar till resten av världen, detta bokföringskonto behövs då.', WTV_Plugin::TEXTDOMAIN ),
		);

		return $descriptions[$option];

	}

	/**
	 * Returns units
	 * @return array
	 */
	public static function get_account_codings(){

		$account_codings_arr = [];
		$account_codings = get_option( 'visma_account_coding', [] );

		if ( empty( $account_codings ) ){
			return array();
		}

		foreach ( $account_codings as $account_coding) {
			$account_codings_arr[] = [
				'value' => $account_coding->Id,
				'label' => $account_coding->Name
			];
		}
		array_unshift( $account_codings_arr, [
			'value' => '',
			'label' => __( 'Välj...', WTV_Plugin::TEXTDOMAIN )
		]);
		return $account_codings_arr;
	}

	public static function get_country_name_from_abbr( $country_abbr ) {
		if ( class_exists( 'WC_Countries' ) ) {
			$countries = new WC_Countries();
			$all_countries = $countries->get_countries(); // Get all countries

			// Check if the abbreviation exists and return the full name
			return isset( $all_countries[ $country_abbr ] ) ? $all_countries[ $country_abbr ] : '';
		}
		return '';
	}
}
